2012-08-08 35 views
3

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

这就是说,有没有一种特定的方式我应该追加我的图像,以便稍后在我自己的项目中更容易地刷新这些图像每5秒?

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

+0

*“我想显示从url获得的图像”*图像的内容是什么?什么是典型的URL? – 2012-08-09 00:58:30

回答

5

考虑使用JLabel网格并在需要时使用JLabel setIcon(Icon icon)方法交换ImageIcons。要每5秒钟做一次这样的事情,可以考虑使用Swing Timer。或者,如果您要每隔三秒钟下载一张图片,则需要SwingWorker<Void, ImageIcon>

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

4

扩展到HovercraftFullOfEels的建议,我会创建一个自定义Component(在这种情况下可能是JLabel)。

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

  1. 这可能会导致你的系统资源流失,如果你有大量的图片,每个组件请求单独下载,
  2. 才能下来每个图像可能需要更长的时间5秒钟的时间。在这种情况下你会做什么?

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

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

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

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

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

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

所有这些想法都利用了Java的Thread功能,在这种情况下,了解Event Dispatching Thread &如何处理Concurrency in Swing

+0

哇。和1 + upvote。 – 2012-08-08 23:23:53

+0

@HovercraftFullOfEes你给了我这个主意;) – MadProgrammer 2012-08-08 23:26:09

+0

哇,非常感谢你在这方面的时间和精力。我从来没有听说过事件调度线程,但我不知道如何处理Swing中的并发,所以我将在第二天左右阅读这些内容。与此同时,我好奇,如果它告诉你,我从一个网址采取的图像是简单的小图像,没有更大的300x100像素;刷新时间可能会延长到5分钟(取决于我的老板的决定) – 2012-08-09 00:29:32

2

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