为何要调用?super.paintComponent()请进来看看(我在谷歌中没找到答案)
【Core Java】中说JPanel与JComponent最大区别是JPanel不透明,而JPanel子类中覆盖paintComponent方法最常见做法是先调用super.paintComponent方法来用背景色绘制面板,可是为什么我没有调用super.paintComponent方法也会默认用背景色来绘制面板呢?
下边是我实验的代码。。
[code = Java]
import javax.swing.*;
import java.awt.*;
public class MySwing {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class SimpleFrame extends JFrame {
public SimpleFrame() {
Toolkit kit = Toolkit.getDefaultToolkit();
setBounds(100, 100, kit.getScreenSize().width/2, kit.getScreenSize().height/2);
setTitle("Very Cool!!!");
setResizable(false);
setBackground(Color.BLACK);
Container c = getContentPane();
MyComponent m = new MyComponent();
c.add(m);
}
}
class MyComponent extends JPanel{
public void paintComponent(Graphics g) {
g.drawString("Very Happy", 100, 100);
}
}
[/code]
------解决方案--------------------你好像正好说反了`! 我不知道 我说的对不对 因为 我看不明白swing源代码
如果 调用 super.paintComponent 会根据 可插入的外观进行 最初的绘制 也就是默认无任何东西的画布 而 如果 不调用 super.paintComponent 根据Graphics 的 api 描述会进行 长久属性保存 (根据系统不同 不尽相同 (Window 自我感觉会完整保存Graphics 的属性)) this.paintComponent(G) 中的G 保存上下文的属性
另:Swing 是 java2D 与 AWT配合 的结果
------解决方案--------------------Java code
import javax.swing.*;
import java.awt.*;
import java.util.Random;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class MySwing {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class SimpleFrame extends JFrame {
public SimpleFrame() {
Toolkit kit = Toolkit.getDefaultToolkit();
setBounds(100, 100, kit.getScreenSize().width/2, kit.getScreenSize().height/2);
setTitle("Very Cool!!!");
setResizable(false);
setBackground(Color.BLACK);
Container c = getContentPane();
final MyComponent m = new MyComponent();
c.add(m);
JButton button = new JButton("Repaint");
button.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent e){
m.repaint();
}
});
c.add(button,BorderLayout.PAGE_END);
}
}
class MyComponent extends JPanel{
private final Random generator = new Random();
public void paintComponent(Graphics g) {
// super.paintComponent(g);
g.drawString("Very Happy", generator.nextInt(getWidth()), generator.nextInt(getHeight()));
}
}