【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]

解决方案 »

  1.   

    你好像正好说反了`! 我不知道 我说的对不对  因为 我看不明白swing源代码如果 调用 super.paintComponent 会根据 可插入的外观进行 最初的绘制 也就是默认无任何东西的画布 而 如果 不调用 super.paintComponent 根据Graphics 的 api 描述会进行 长久属性保存 (根据系统不同 不尽相同 (Window 自我感觉会完整保存Graphics 的属性))  this.paintComponent(G) 中的G 保存上下文的属性另:Swing 是 java2D 与 AWT配合 的结果
      

  2.   

    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()));
        }
    }
    点击repaint 按钮,可以看到有没有super.paintComponent(g)的区别
      

  3.   

    额  懂了 貌似那天搞错了 弄成了JComponent的
      

  4.   

    不好意思哥们 没看懂。不过最后一句我今天刚在书上边看到 对Swing又了解了一点  还是谢谢了