3

我知道关于这个问题已经发布了很多问题和答案,但我相信我的情况有点扭曲。我在 JFrame 中有一个 JPanel;Jpanel 具有网络地图的绘制图像背景。我使用 MigLayout 创建了一个布局。在此布局的单元格内,我想显示从 url 获得的图像。扭曲的是,在我的项目中,我希望能够每 5 秒左右刷新一次该图像。

话虽如此,我是否应该采用一种特定的方式来添加我的图像,以便以后在项目中每 5 秒刷新一次这些图像时让自己更容易?

如果我缺少任何必要的附加信息,请告诉我。

4

3 回答 3

5

考虑使用 JLabel 网格并在需要时使用 JLabelsetIcon(Icon icon)方法交换 ImageIcons。要每 5 秒执行一次类似的操作,请考虑使用 Swing Timer。或者,如果您打算每 xxx 秒下载一次图像,那么SwingWorker<Void, ImageIcon>.

如果这没有帮助,那么请具体说明您可能被卡住的位置。

于 2012-08-08T22:34:49.903 回答
4

扩展 HovercraftFullOfEels 建议,我将创建一个自定义ComponentJLabel在这种情况下可能是一个)。

我会javax.swing.Timer在每个中使用一个,设置为每 5 秒重复一次,这将执行一个下载请求。这里的问题是;

  1. 如果您有大量图像,可能会导致系统资源耗尽,并且每个组件都需要单独下载
  2. 关闭每个图像所需的时间可能会超过 5 秒。在那种情况下你会怎么做?

另一种方法是有一个集中的队列来负责处理下载请求。这可以是自动的(即,您注册Component它并决定何时更新)或愚蠢的,您可以随时添加请求。

在自动化模型中,您可以更好地控制资源管理。

在这种情况下,我很想使用ScheduledExecutorService之类的东西来管理下载任务。基本思想是,在未来的给定时间(5 秒),下载任务将执行,这将下载图像并将其应用于Component,然后将新的下载请求注册回ScheduledExecutorService

这种方法允许您控制系统创建的线程数以及修改请求之间的时间。

在愚蠢的模型中,我可能会使用javax.swing.Timer& 的组合ExectutorService(可能是ThreadPoolExecutor)。计时器将与 each 相关联Component,当它触发时,它将一个新请求放入哑队列。愚蠢的队列,在未来的某个时候会下载图像并将其返回给Component.

我看到的主要问题是,组件有可能在前一个请求完成之前请求新图像。虽然您可以使用一些技术来捕获这些条件,但使用智能队列的想法会更简单、更容易

所有这些想法都利用了 Java 的Thread功能,在这种情况下,了解事件调度线程以及如何在 Swing 中处理并发非常重要

于 2012-08-08T23:22:49.443 回答
2

如果“5 秒图像”显示“网络状态更新”或类似内容,则应用程序。可能会更好(带宽明智,以及避免图像缓存)以文本(或对象等)的形式获取更新,然后创建适当的图像并在需要时调用重绘。

于 2012-08-09T00:59:29.130 回答