我知道关于这个问题已经发布了很多问题和答案,但我相信我的情况有点扭曲。我在 JFrame 中有一个 JPanel;Jpanel 具有网络地图的绘制图像背景。我使用 MigLayout 创建了一个布局。在此布局的单元格内,我想显示从 url 获得的图像。扭曲的是,在我的项目中,我希望能够每 5 秒左右刷新一次该图像。
话虽如此,我是否应该采用一种特定的方式来添加我的图像,以便以后在项目中每 5 秒刷新一次这些图像时让自己更容易?
如果我缺少任何必要的附加信息,请告诉我。
考虑使用 JLabel 网格并在需要时使用 JLabelsetIcon(Icon icon)
方法交换 ImageIcons。要每 5 秒执行一次类似的操作,请考虑使用 Swing Timer。或者,如果您打算每 xxx 秒下载一次图像,那么SwingWorker<Void, ImageIcon>
.
如果这没有帮助,那么请具体说明您可能被卡住的位置。
扩展 HovercraftFullOfEels 建议,我将创建一个自定义Component
(JLabel
在这种情况下可能是一个)。
我会javax.swing.Timer
在每个中使用一个,设置为每 5 秒重复一次,这将执行一个下载请求。这里的问题是;
另一种方法是有一个集中的队列来负责处理下载请求。这可以是自动的(即,您注册Component
它并决定何时更新)或愚蠢的,您可以随时添加请求。
在自动化模型中,您可以更好地控制资源管理。
在这种情况下,我很想使用ScheduledExecutorService之类的东西来管理下载任务。基本思想是,在未来的给定时间(5 秒),下载任务将执行,这将下载图像并将其应用于Component
,然后将新的下载请求注册回ScheduledExecutorService
这种方法允许您控制系统创建的线程数以及修改请求之间的时间。
在愚蠢的模型中,我可能会使用javax.swing.Timer
& 的组合ExectutorService(可能是ThreadPoolExecutor)。计时器将与 each 相关联Component
,当它触发时,它将一个新请求放入哑队列。愚蠢的队列,在未来的某个时候会下载图像并将其返回给Component
.
我看到的主要问题是,组件有可能在前一个请求完成之前请求新图像。虽然您可以使用一些技术来捕获这些条件,但使用智能队列的想法会更简单、更容易
所有这些想法都利用了 Java 的Thread
功能,在这种情况下,了解事件调度线程以及如何在 Swing 中处理并发非常重要
如果“5 秒图像”显示“网络状态更新”或类似内容,则应用程序。可能会更好(带宽明智,以及避免图像缓存)以文本(或对象等)的形式获取更新,然后创建适当的图像并在需要时调用重绘。