1

我有以下代码:

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

我希望它以适当的方式(在按下按钮后)绘制表单,但发生的情况是它在第一次单击后仅绘制背景,在第二次单击后绘制其余对象。当我尝试这种方法时,使用重写的paint方法:

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

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

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

4

2 回答 2

2

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

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

代替:

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

或者设置背景颜色并在您的paint() 方法中,在绘制其他任何内容之前调用超级实现:

super.paint(g);
于 2013-07-02T15:23:38.587 回答
2
Graphics g = getGraphics();

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

component.setBackground(...);

自定义绘画是通过覆盖自定义组件的 paintComponent() 方法来完成的。不要忘记在开始时调用 super.paintComponent()。阅读自定义绘画的 Swing 教程以获取更多信息。

于 2013-07-02T15:22:15.360 回答