日期:2014-05-20  浏览次数:20706 次

为何要调用?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()));
    }
}