我有一个java应用程序,可以传输原始数据并相应地绘制实时图。这是通过调用我编写的使用 Graphics 对象的类中的方法来处理的。我在重写的paintComponent方法中实现了算法,以根据最新数据生成所有绘图。我的类中有其他方法来更新 PaintComponent 方法中使用的变量来绘制图形。
在我的主类中,我在计时器事件处理程序中定期更新我的图表。在事件处理程序中,我调用 graphs 类中的方法来更新某些变量,进行一些计算,然后调用 repaint() (这显然是调用 PaintComponent 方法的正确方法)。
我的问题是,我在 PaintComponent 方法中使用的算法可能需要(相对)较长的时间才能完成,具体取决于我的绘图的数量和分辨率。 (我还没有完全遇到这个问题,但我现在正在尝试解决它)。当然,我不希望所有这些图形占用我的应用程序的所有处理时间,所以我想知道是否可以让“paintComponent”在单独的线程中执行。
如果我在 main 中创建一个子类以在单独的线程中运行并简单地调用我描述的图形方法,会发生什么?这会自动使所有这些方法(包括paintComponent)在新线程中执行吗?或者我是否必须修改我的图形类本身才能使其工作?理想情况下,我希望避免修改我的图形类,因为我已经将其设计为在 NetBeans GUI 构建器中作为 JPanel 工作,并且我希望避免破坏该功能。
有几个选择。
一种方法是使用两个 BufferedImage,您可以在单独的线程中绘制一个,然后从另一个绘制,并在绘制完成时进行切换(我认为经常是快照。)
更好的解决方案是拥有一个可直接渲染数据的模型(因为可以绘制它所保存的数据,而无需对其执行任何进一步的算法工作)。
这意味着您将在单独的线程上执行算法,计算将用于绘制的值,调用 SwingUtilities.invokeLater 来更新模型。然后,模型将仅在 Swing 线程上更新,并且当您重新绘制时,您可以准确访问需要绘制的数据(并且没有无关的数据)。
如果这些数据仍然太多,以至于绘制需要很长时间(即:如果您正在绘制包含大量数据点的图表),您将发送命令来计算窗口的哪些部分需要重新绘制,并在该部分上触发 repaint() 。然而,这件作品应该是一个拉特度假村。 99% 的性能将来自于将算法移至单独的线程中,并让画家能够直接访问可渲染的数据。
如果您查看使用外部数据更新 TableModel 的最佳实践,您所要做的就是获取后台线程(通常是 SwingWorker)中发生的数据,然后通过 invokeLater() 将数据发布到实际模型(这就是数据)当你的paint()尝试读取它时,它不会被修改。)然后从模型更新中触发适当的事件,告诉表哪些单元格发生了变化。然后,表知道其视口的哪一部分需要重新绘制并触发适当的 repaint() 方法。在此期间,后台线程可以继续检索数据并通过invokeLater 将新的更新添加到事件队列。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)