我目前正在学习Swing并且遇到了精神障碍。我知道当我想要绘制到JPanel时,我需要调用paintComponent方法。我已经阅读了几个逻辑不应该位于paintComponent块中的地方。如果我想要一个计时器来确定什么时候被绘制,我是否不必从另一个类的另一个方法调用paintComponent并创建该类的实例,该实例也在paintComponent中扩展JPanel?
我认为我要避免的是以下内容......
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(blah,blah,blah);
if(timesUP==true){
paintSomethingElse(g);
}
repaint();
}
相反,我得到的印象是我应该为if语句的逻辑创建一个完全不同的方法,并以某种方式从单独的方法绘制。
我不理解什么?
这是否已经具体回答了?我无法找到一个答案,帮助我真正理解如何有效地分离两者,允许在同一个JPanel上绘制多个图形。
答案 0 :(得分:2)
这取决于。如果逻辑与实际的绘制过程有关,那么就没有理由不将它放入paintComponent
方法中。
您要避免的是在paintComponent
中添加逻辑以更改绘制过程的状态,因为paintComponent
可能因任何原因而被调用,其中许多原因是您没有的控制。
paintComponent
方法应该绘制组件的当前状态,这就是全部,它不应该参与更改或更新该状态(这实际上可能导致无限重绘循环,这将占用您的CPU周期)
答案 1 :(得分:0)
我还必须制作一个Java Swing应用程序,它有很多要做的事情 - JPanel必须绘制多个自定义组件,当用户与它们交互时,这些组件在屏幕上移动。
paintComponent
方法用于绘图,应该是它的结尾。只要你不等待条件,设置其他物体的状态或任何可能一方面减慢你的速度,另一方面发送给你的任何东西,有条件的绘画在paintComponent
中是可行的。等待永远。我把这里的逻辑称为反应逻辑。
另一方面,不要忘记重新涂漆可以在外部触发,只要您需要它。这样,您可以在一定程度上将逻辑与绘画分开。使用侦听器,创建自己的事件,但将动作逻辑保留在paintComponent
之外。您可以在进入绘画之前轻松找到设置状态的方法,这样当您决定绘画时,您只会对状态作出反应。
不要忘记:如果你是多线程,如果你处理对象的半集状态,绘画可能会变得混乱。 仔细穿线!
答案 2 :(得分:0)
如果逻辑非常复杂,并且从paintComponent
内部调用可能太慢(在此方法运行时,应用程序的所有GUI都停止),您应该定义一个单独的update
方法准备预先计算的布尔标志,坐标,图像和paintComponent
可用于快速生成最终视图的其他值。
此类更新方法可以在单独的线程中运行。您应该在此方法结束时调用repaint()
或(如果布局可能会更改)invalidate()
。为所有准备好的值使用单独的对象,并确保绘制线程和更新线程不会访问同一个实例一次。
如果逻辑足够快,我认为在paintComponent
方法中定义它没有问题。如果逻辑很复杂但仍然足够快,可以在一些直接从paintComponent
调用的方法中定义它。