【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())); }}