当前位置: 代码迷 >> J2SE >> 为何要调用?super.paintComponent()请进来看看(小弟我在谷歌中没找到答案)
  详细解决方案

为何要调用?super.paintComponent()请进来看看(小弟我在谷歌中没找到答案)

热度:369   发布时间:2016-04-24 02:15:35.0
为何要调用?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()));    }}
  相关解决方案