Swing之paint与paintComponent的区别
来源:互联网 发布:node.js实战 编辑:程序博客网 时间:2024/06/04 00:57
查API文档,查得在类Jcomponent下的paint方法有以下解释:
paintComponent
, paintBorder
, and paintChildren
. They're called in the 也就是说当Swing中的paint方法被调用时,paintComponent、paintBorder、 paintChildren 这三个方法也会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。
所以paintComponent就是本身这个容器自己画出自己组件的方法了。如果只是为了改变本身这个容器中的组件,只需要改写paintComponent方法就可以了,如果还要保留容器中的原本组件就别忘了调用super.paintComponent(g)。如果要改写paint方法来改变本身这个容器的组件,那么也别忘了要调用super.paint(g),不然出来的东西是不包含原组件、原边框和子组件的。这个做个实验就可以很快验证的。
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
}
public static void main(String[] args){
JFrame frame = new JFrame();
MyDrawPanel panel = new MyDrawPanel();
JLabel label = new JLabel("aaa");
panel.setBackground(Color.blue);
panel.add(label);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
以上这个程序除了JPanel本身正常显示之外还会显示出子组件label和一个方块。如果注释掉super.paint(g),那么就只能显示出方块了。
不过我还发现了一个更神奇的地方。
那就是以上这些只适用于Swing,如果换成awt就不同了。
awt要改变组件样式,只能重写paint方法了,因为他是没有paintComponent方法的。什么?你有发现这个方法?!如果你看清楚你就会发现这个方法不是paintComponent而是paintComponents方法,后面多了一个s
这个paintComponents方法按API说是用来把所有的容器内组件都显示出来的方法,我做了一下实验,这个方法在容器对象初始化的时候应该是没有被自动调用的,当你要用的时候只能自己调用了,不过好像只是显示出子组件而已,因为awt中即使重写paint方法而没有调用父类的paint方法是不影响本身容器自己的组件显示的。这是一个例子:
public void paint(Graphics g){
//super.paint(g);
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
paintComponents(g);
}
public static void main(String[] args){
JFrame frame = new JFrame();
MyDrawPanel panel = new MyDrawPanel();
JLabel label = new JLabel("aaa");
panel.setBackground(Color.blue);
panel.add(label);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
0 0
- Swing之paint与paintComponent的区别
- Swing之paint与paintComponent的区别
- Swing之paint与paintComponent的区别
- java--Swing之paint与paintComponent的区别
- 【Swing】paint与paintComponent的区别
- swing 中paint与paintComponent的区别(jcomponent)
- Swing编程方面步骤之三JFrame、JPanel、paint与paintComponent的区别
- paint()与paintComponent()的区别
- paint()方法与paintComponent()方法的区别
- paint().paintComponent()方法的区别
- Swing paint和paintComponent方法的关系
- Java paint与paintComponent的区别与联系
- paint方法和paintComponent的区别
- java中组件的paint(Graphics g)与paintComponent(Graphics g)的区别
- Java 关于paintComponent与paint有什么区别?各自的特征
- 【paint和paintComponent的区别,兼谈Canvas和JPanel】
- 关于awt/swing组件中paint, update, paintComponent, repaint的经验
- 关于awt/swing组件中paint, update, paintComponent, repaint的经验
- github学习笔记
- c/C++程序内存分配方式
- OC _字典的一些属性,和一些重要用法
- 背包问题
- iOS持续部署平台(一):SHENZHEN
- Swing之paint与paintComponent的区别
- [线段树] poj2823 Sliding Window
- 【转】[C#List的Sort()、Find()、FindAll()、Exist()的使用方法举例
- setNilValueForKey:could not set nil as the value for the key distance.解决方案
- HDU 1059 Dividing(多重背包)
- 解压tar.xz文件
- 函数
- hdoj-1197-Specialized Four-Digit Numbers
- 禁用掉横竖屏切换