都说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),不然出
来的东西是不包含原组件、原边框和子组件的。
原文:http://www.cnblogs.com/Ruby517/p/6352275.html