当我尝试绘制到我的扩展版本的JPanel时,我一直遇到这个问题。每一次,我终于找到了让它发挥作用的方法。但我想确切地知道为什么用这种方式绘制到JPanel不起作用?
public class MyPanel extends JPanel {
public MyPanel(){
init();
}
public void init(){
JFrame frame = new JFrame("");
frame.add(this);
this.setPreferredSize(new Dimension(100,100));
this.setBackground(Color.RED);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
Graphics g = this.getGraphics();
g.setColor(Color.BLUE);
g.fillRect(0, 0, 50, 50);
}
public static void main(String[] args) {
new MyPanel();
}
}
当我运行此代码时,我看到了我期望从setBackground(Color.RED)获得的红色背景,但是我没有看到我使用Graphics对象绘制的蓝色矩形。即使我在init()的最后一行调用repaint(),它也不会显示。
这段代码出了什么问题,以后我可以避免使用它?
答案 0 :(得分:3)
为什么我不能使用Graphics绘制到我的JPanel上?
因为这不是正确的方法。您应该覆盖paintComponent
方法:
public class MyPanel extends JPanel {
public MyPanel(){
init();
}
public void init(){
JFrame frame = new JFrame("");
frame.add(this);
this.setPreferredSize(new Dimension(100,100));
this.setBackground(Color.RED);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new MyPanel();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(0, 0, 50, 50);
}
}
如果您不这样做,您的绘图只会显示片刻,然后它就会消失。这样,无论何时调用repaint
方法(或应用程序重新绘制本身),都会调用该方法并填充矩形。
答案 1 :(得分:2)
Swing中的自定义绘制通常通过覆盖从paintComponent
JComponent
类方法来完成
有关详细信息,请参阅Performin a Custom Painting
基本上,问题是,在Swing中绘画是破坏性的过程。每次发生绘制周期时,都需要清理并重新生成输出。 getGraphics
不可靠。它可以返回null,并且paint
使用它的任何内容都将在下一个绘制周期中被绘制