用于java图形的多线程

Ben*_*Ben 4 java graphics swing multithreading netbeans

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

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

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

如果我在我的main中创建一个子类以在一个单独的线程中运行并简单地调用我描述的图形方法会发生什么?会自动使所有这些方法(包括paintComponent)在新线程中执行吗?或者我是否必须修改我的图表类本身才能使用?理想情况下,我想避免修改我的图类,因为我已经将它设计为在NetBeans GUI构建器中作为JPanel工作,我想避免破坏该功能.

Rev*_*nzo 5

有几种选择.

一种方法是使用两个BufferedImages,您画上一个单独的线程,并从其他的一个油漆,并切换为绘制完成(什么,我认为是一个快照,每隔一段时间.)

一个更好的解决方案是拥有一个可直接渲染的数据模型(就像它所持有的数据一样,无需对其进行任何进一步的算法工作).

这意味着您将在单独的线程上执行alogirthms,计算将用于绘制的值,调用SwingUtilities.invokeLater来更新模型.然后,模型将仅在Swing线程上更新,并且当您重新绘制时,您可以访问您需要绘制的数据(并且没有无关数据).

如果这个数据仍然很多,以至于绘画需要很长时间(例如:如果你正在绘制具有大量数据点的图表),你将发送以计算窗口的哪些部分需要重新绘制并激活重绘() .然而,这件作品应该是一个拉特胜地.99%的性能将来自将算法移动到单独的线程中,并使画家可以访问直接可渲染的数据.

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