首页 > 其他 > 详细

绘图组件paint和paintComponent的区别

时间:2017-01-27 07:04:49      阅读:355      评论:0      收藏:0      [点我收藏+]

    都说Swing是个坑,果不其然,今天在学习绘图组件的时候,照着书上的代码,就出现了弹出窗体,

却没出现绘图组件的问题,当然,我还是菜鸟。所以还请原谅我犯这么低级的错误。

 

    参考: 《Head First Java》P-364

    C博客大伽: http://blog.csdn.net/u012270113/article/details/38898083

                                                                                         一不小心就过年了。新年快乐

1. 我们首先来创建一个窗口/界面

 1 package demo;                // 导入包名
 2 
 3 import javax.swing.JFrame;   // 或import javax.swing.*;
 4 
 5 public class MyPanel {
 6     public static void main(String[] args) {
 7         new MyPanel();      // 用new方法创建MyPanel对象, 执行构造函数
 8     }
 9  
10     MyPanel() {             // 构造函数——类名(){}, 在创造类的实例(使用new)时执行
11         
12         JFrame frame = new JFrame();     
13         // 关闭window时结束程序, 不然每运行一次代码, 就会产生一个javaw.exe进程, 占用内存 
14         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
15         frame.setSize(800, 600);           // 设置窗口的长和宽
16         frame.setVisible(true);            // 设置true才是可见, 才能弹出窗口/界面
17     }
18 }

技术分享

 

2. 接着就是创建绘图组件

 1 package demo;                // 导入包名
 2 
 3 import java.awt.*;
 4 import javax.swing.*;       // 或import javax.swing.*;
 5 
 6 public class MyPanel extends JPanel {
 7     public static void main(String[] args) {
 8         new MyPanel();      // 用new方法创建MyPanel对象, 执行构造函数
 9     }
10  
11     MyPanel() {             // 构造函数——类名(){}, 在创造类的实例(使用new)时执行
12         
13         JFrame frame = new JFrame();     
14         JLabel label = new JLabel("标签");
15         
16         this.add(label);            // 除了JFrame对象不可以使用add(), 像JPanael, JLabel均可
17         frame.getContentPane().add(this); //把JPanel及JPanel上的其他组件都加入顶层容器JFrame  
18         this.setBackground(Color.pink);
19         
20         // 关闭window时结束程序, 不然每运行一次代码, 就会产生一个javaw.exe进程, 占用内存 
21         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
22         frame.setSize(800, 600);           // 设置窗口的长和宽
23         frame.setVisible(true);            // 设置true才是可见, 才能弹出界面
24     }
25     
26     public void paintComponent(Graphics g) {
27         super.paintComponent(g);          // "Ctrl + /"注释掉该行的话,背景颜色就会消失
28         g.setColor(Color.orange);
29         g.fillRect(20, 50, 100, 100);
30     }
31 }

技术分享

 

1.JFrame和JPanel区别

    包含Swing组件的程序必须包含一个顶级容器。但是Swing组件不可以直接加入到顶级容器中,而

JFrame是顶级容器。通常是把Swing组件先加入JFrame, JDialog, and JApplet三个顶层容器类中

的一个,然后再放入JFrame中。

 

2.add()是任何JComponent都可以调用的,JPanel也可以,但是JFrame不可以。 

    对JFrame添加组件有两种方式,常用方式一。即通过 getContentPane ()方法获得JFrame的内

容面板,再对其加入组件,如frame. getContentPane ().add(childComponent)。

    

3. Swing中paint与paintComponent的区别

    当Swing中的paint方法被调用时, paintComponent、paintBorder、 paintChildren 这三个方法也

会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。

paintComponent就是本身这个容器自己画出自己组件的方法,且在JComponent中的方法paintCom

ponent()还是保护类型的,即我们平常并不用管这个方法。只在我们需要改变绘制组件动作的时候,

类只要先继承paintComponent(一般是JFrame),然后重写这个方法即可。

    总之:

   (1)如果只是为了在Swing中改变组件样式,重写paintComponent就可以了,其他paintBorder和

paintChildren默认。如果还要保留容器中的原本组件就别忘了调用super.paintComponent(g)。

   (2)如果要改写paint方法来改变本身这个容器的组件,那么也别忘了要调用super.paint(g),不然出

来的东西是不包含原组件、原边框和子组件的。

绘图组件paint和paintComponent的区别

原文:http://www.cnblogs.com/Ruby517/p/6352275.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!