2011-11-02 89 views
4

我有一个Java应用程序,流原始数据并绘制相应的实时绘图。这是通过调用我写的使用Graphics对象的类的方法来处理的。我在重写的paintComponent方法中实现了算法,以生成最新数据的所有图。我在我的类中有其他方法来更新paintComponent方法中绘制图形所使用的变量。多线程的Java图形

在我的主类中,我定期更新我的图形定时器事件处理程序。在事件处理程序中,我调用更新某些变量的图表类中的方法,进行一些计算,然后调用repaint()(显然是调用paintComponent方法的正确方法)。

我的问题是,我在paintComponent方法中使用的算法可能需要(相对)很长时间才能完成,具体取决于我的图的数量和分辨率。 (我还没有完全遇到这个问题,但我试图解决它现在)。当然,我不希望所有这些图形都占用我应用程序的所有处理时间,所以我想知道是否可以在单独的线程中执行“paintComponent”。

如果我在我的主要创建一个子类运行在一个单独的线程,并简单地称为我描述的图形方法会发生什么?会自动使所有这些方法(包括paintComponent)在新线程中执行?或者我会不得不修改我的图形类本身为此工作?理想情况下,我想避免修改我的图表类,因为我已经将它设计为在NetBeans GUI构建器中作为JPanel工作,并且我想避免打破该功能。

回答

4

你必须重定向漆方法的SwingWorkerRunnable#Thread(全部输出到GUI必须被包裹成invokeLater),例如herehere

5

有一对夫妇选择。

一种方法是使用两个BufferedImages,在那里你在一个单独的线拉出,然后从另一个油漆,并切换为绘制完成(什么,我认为是一个快照,每隔一段时间。)

一个更好的解决方案是建立一个可直接渲染的数据模型(因为它可以绘制的数据不需要进一步的算法工作就可以绘制)。

这意味着你将在一个单独的线程上执行你的alogirthms,计算将用于绘制的值,并调用SwingUtilities.invokeLater来更新模型。模型只会在Swing线程上得到更新,当您重绘时,您可以准确访问您需要绘制的数据(并且不会有无关的数据)。

如果这些数据仍然太多以至于绘画需要很长时间(即:如果您绘制的图表中有大量数据点),那么您将发送来计算窗口的哪些部分需要重新绘制并重新绘制重绘( )就这一点。然而,这件作品应该是拉特度假村。 99%的表现将来自将算法移入单独的线程,并让画家可以直接呈现数据。

如果您查看有关使用外部数据更新TableModel的最佳实践,您拥有的是在后台线程(通常是SwingWorker)中获取数据然后通过invokeLater()将其发布到实际模型的工作当paint()试图读取数据时,数据不会被修改),然后从模型更新中触发适当的事件,告诉表格哪些单元格发生了变化。然后该表知道它的视口的哪部分需要重新绘制,并触发相应的repaint()方法。在此期间,后台线程可以继续检索数据并通过invokeLater向事件队列添加新更新。

1

那么,如果你想提高GUI的响应速度,你可以做一个SwingWorker冗长的工作,虽然我不知道这样做会加快你的应用程序。

1

我有一个Java应用程序,流原始数据,并绘制相应的实时 图。这是通过调用使用Graphics对象的类i 中的方法调用的。

要完成他人的答案: 你应该真的考虑使用JFreeChart。这是一个绘制图表的好库,你可以动态修改显示的数据集(并做很多事情)。

+0

对,输出到GUI的输出很大+1 – mKorbel

+0

是的,这是我探索的第一个选项,但我实际上并不喜欢数据的显示方式。我的课程是专门为示波器输出建模而设计的,并且已按照我想要的方式工作。 – Ben