我有以下代码:
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();
}
然后背景为灰色而不是蓝色,按钮消失(仅在我将鼠标放在它上面后才会出现)。
所以,最后我的问题是:这两个例子究竟出了什么问题(我想要理解这两个例子,因为这只是一个学习练习,我想知道发生了什么,而不是简单地找到解决方案),哪种方法更好?在此先感谢,我希望我不会错过这个网站上的类似问题,如果我对不起!
答案 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);