将逻辑集成到paintComponent中

时间:2014-09-19 07:13:28

标签: java swing

我目前正在学习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上绘制多个图形。

3 个答案:

答案 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调用的方法中定义它。