【问题标题】:multithreading for java graphicsjava图形的多线程
【发布时间】:2011-12-20 13:20:45
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java multithreading swing graphics netbeans


    【解决方案1】:

    我有一个 Java 应用程序,它可以流式传输原始数据并实时绘制 相应地绘制。这是通过调用类 i 中的方法来处理的 使用 Graphics 对象编写。

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

    【讨论】:

    • 是的,这是我探索的第一个选项,但我实际上不喜欢数据的显示方式。我的课程是专门为模拟示波器输出而设计的,并且已经按照我想要的方式工作了。
    【解决方案2】:

    好吧,如果您想提高 GUI 的响应能力,您可以在 SwingWorker 中完成冗长的工作,尽管我不知道这样做是否会加快您的应用程序的速度。

    【讨论】:

      【解决方案3】:

      您必须将绘制方法重定向到SwingWorkerRunnable#Thread(所有到GUI 的输出必须包装到invokeLater),例如herehere

      【讨论】:

        【解决方案4】:

        有几个选项。

        一种方法是使用两个 BufferedImage,您可以在单独的线程中绘制一个,然后从另一个绘制,并在绘制完成时切换(因为我假设它经常是一个快照。)

        一个更好的解决方案是拥有一个可直接渲染数据的模型(因为它所拥有的数据可以在不对其执行任何进一步的算法工作的情况下绘制)。

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

        如果这些数据仍然太多以至于绘制需要很长时间(即:如果您正在绘制包含大量数据点的图表),您将发送以计算窗口的哪些部分需要重新绘制并触发 repaint()仅此而已。然而,这件作品应该是一个度假胜地。您 99% 的性能将来自将算法转移到单独的线程中,并让画家可以访问直接可渲染的数据。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-11
          • 1970-01-01
          相关资源
          最近更新 更多