为什么setBackground会覆盖其他绘图?

时间:2013-07-02 15:04:47

标签: java swing drawing setbackground

我有以下代码:

    private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    getContentPane().setBackground(new Color(50, 100, 200));
    Graphics g = getGraphics();
    g.drawString("tekst", 120, 120); 
    g.drawLine(175, 175, 140, 140); 
    g.setColor(Color.yellow); 
    g.fillOval(190, 120, 160, 160); 
    g.setColor(Color.red); 
    g.drawRoundRect(190, 110, 150, 120, 115, 115);  
}    

我希望它以适当的方式绘制表单(按下按钮之后),但相反的是它在第一次单击后仅绘制背景,在第二次单击后绘制其他对象。 当我尝试这种方法时,使用覆盖绘制方法:

public void paint(Graphics g){
    setBackground(new Color(50, 100, 200));       
    g.drawString("tekst", 120, 120); 
    g.drawLine(175, 175, 140, 140); 
    g.setColor(Color.yellow); 
    g.fillOval(190, 120, 160, 160); 
    g.setColor(Color.red); 
    g.drawRoundRect(190, 110, 150, 120, 115, 115);  
}

并且

private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    repaint();  
}

然后背景为灰色而不是蓝色,按钮消失(仅在我将鼠标放在它上面后才会出现)。

所以,最后我的问题是:这两个例子究竟出了什么问题(我想要理解这两个例子,因为这只是一个学习练习,我想知道发生了什么,而不是简单地找到解决方案),哪种方法更好?在此先感谢,我希望我不会错过这个网站上的类似问题,如果我对不起!

2 个答案:

答案 0 :(得分:2)

Graphics g = getGraphics();

不要使用getGraphics()来进行自定义绘画。这种类型的绘画只是暂时的,并且在下次Swing重新绘制组件时将丢失。另外,不要覆盖paint()方法。要设置组件的背景颜色:

component.setBackground(...);

自定义绘制是通过覆盖自定义组件的paintComponent()方法完成的。不要忘记在开始时调用super.paintComponent()。有关详细信息,请阅读Custom Painting上的Swing教程。

答案 1 :(得分:2)

覆盖绘制的方法是正确的,您应该使用:

g.setColor(new Color(50, 100, 200));
g.fillRect(0, 0, c.getWidth(),c.getHeight());

而不是:

setBackground(new Color(50, 100, 200));   

或者设置背景颜色,在paint()方法中,在绘制其他内容之前调用super实现:

super.paint(g);