java 图形的多线程

2024-03-12

我有一个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(使用前将#替换为@)

java 图形的多线程 的相关文章

随机推荐

  • 如何使用 Numpy 对字符串数组进行一次性编码?

    我知道那里有次优的解决方案 但我正在尝试优化我的代码 到目前为止 我发现的最短方法是 import numpy as np from sklearn preprocessing import OrdinalEncoder target np
  • 使用 re.match 或 re.search 返回多个匹配项

    我正在将一些代码转换为微型蟒蛇 http micropython org我陷入了一个特定的正则表达式 在Python中我的代码是 import re line 0 1 24 2 1 180108205500W 00001 290 m3 be
  • UITableView 中的 UISearchBar

    我试图模仿类似于 iPod 应用程序的艺术家表视图的行为 它是一个分段表视图 右侧有一个部分索引 顶部有一个搜索栏 但在显示视图时最初是隐藏的 我使用的是sdk 3 1 2和IB 所以简单地拖了一个UISearchDisplayContro
  • 为什么 Visual Studio 2019 不支持 Openmp 的 for-reduction 中的关键字“max”?

    当我像这样使用 openmp 时 pragma omp parallel for reduction max dumax IDE 将在 Openmp 中引发错误 max reduction 无效 pragma omp parallel fo
  • 托管 c++/cli .net 将固定字节数组转换为字符串^

    如何在托管 c cli 中将固定字节数组转换为字符串 例如我有以下字节数组 Byte byte data 5 byte data 0 a byte data 1 b byte data 2 c byte data 3 d byte data
  • 如何在 Kendo Grid 的每一行中添加自定义按钮

    我正在尝试将自定义按钮添加到 Kendo 网格的每一行 但我没有得到所需的输出 所以我的要求是向每一行添加动态按钮 然后单击这些按钮 我需要处理一些我需要的东西要传递给该按钮单击的几个列值 我试过类似的东西 Html Kendo Grid
  • 跟踪 IP 地址和国家/地区名称 (asp.net)?

    昨天我看到一个网站 其中列出了IP地址和国家名称 说最近访问过的成员 带有国家名称 城市名称的IP地址列表 我可以知道如何跟踪该信息 任何参考或任何代码吗 谢谢 请检查这些问题 检测 估计 ASP NET 中 http 请求的国家 地区 h
  • 用于列出用户的 S3 存储桶内的特定文件夹的 IAM 策略

    我在桶下面有下面的钥匙客户演示 demo for customers customer1 demo for customers customer2 现在我有 2 个客户客户1 and 客户2 这就是我要的 仅授予他们访问权限客户演示 buc
  • 给定一个数的质因数分解,生成该数的所有因数

    如果您已经对一个数字进行质因数分解 那么获得该数字的所有因数的集合的最简单方法是什么 我知道我可以从 2 循环到 sqrt n 并找到所有可整除的数字 但这似乎效率很低 因为我们已经有了质因数分解 我想它基本上是组合 选择函数的修改版本 但
  • 熊猫 corr() 与 corrwith()

    Pandas 提供两种不同的相关函数的原因是什么 DataFrame corrwith 其他 轴 0 drop False 两个DataFrame对象的行或列之间的相关性成对计算 vs DataFrame corr method pears
  • Jackson 序列化 可选,YAML 为空值

    目前我正在使用YAML工厂 https fasterxml github io jackson dataformats text javadoc yaml 2 11 配置ObjectMapper序列化和反序列化Pojos lt gt YAM
  • 显示片段中的对话框?

    我有一些片段需要显示常规对话框 在这些对话框中 用户可以选择是 否答案 然后片段应该做出相应的行为 现在Fragment类没有onCreateDialog 方法来重写 所以我想我必须在包含的外部实现对话框Activity 没关系 但是接下来
  • 当 url 包含锚点时,获取页面加载时网页滚动条的垂直位置

    我使用 jQuery 的scrollTop 方法来获取页面加载时滚动条的垂直位置 我需要在执行 url 中的锚点后获取此值 例如 url www domainname com foo 我可以使用以下代码 它可以在 Firefox 和 IE
  • iPhone 解锁时 Xcode“设备锁定”

    当我尝试构建并运行时 Xcode 说我的设备已锁定 我看了看我的 iPhone 它根本没有锁定 我该如何解决 我的手机设置为 信任 Mac 但我在 Xcode 6 1 1 中仍然遇到此错误 这对我有用 拔掉设备插头 退出 xcode 打开X
  • 测试示例集属性应等于训练示例集 Rapidminer SVM 的 OR 超集

    I am new to Rapid Miner and using SVM Linear in it My model is as I made Training Example set which consist of 3552 exam
  • 动态 Java 整数/长溢出检查与性能

    这是一个相当理论化的问题 因此虽然该语言是 Java 特有的 但任何通用的解决方案都足够了 假设我想编写一个简单的阶乘函数 long factorial int n handle special cases like negatives e
  • Xamarin 表单更改导航栏的背景颜色

    我正在使用 Xamarin Forms 并尝试更改 iOS 上导航栏的背景颜色 我有一个继承自 NavigationPage 的自定义导航栏类 具有可绑定属性和构造函数 用于设置导航栏的颜色 根据我的理解 导航栏顶部有一个默认背景 黑色 X
  • 从 fresco 获取 bitmapdrawable

    我正在尝试从 SimpleDraweeView 获取位图 我已经使用 uri 图像设置了 SimpleDraweeView final Uri uri new Uri Builder scheme UriUtil LOCAL RESOURC
  • 如何阻止 Docker 注册表?

    我想阻止对默认 docker io 注册表的访问 为了安全 IP 保护 我们需要阻止对公共 Docker 中心的推 拉访问 曾经有过many尝试将此作为配置选项 但所有 PR 都不断被拒绝 红帽已经实现了 block registry 和
  • java 图形的多线程

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