2012-08-08 34 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秒圖像'顯示'網絡狀態更新'或類似的應用程序。可能會更好(帶寬明智,以及避免圖像緩存)獲取作爲文本(或對象等)的更新,然後創建適當的圖像,並在需要時調用重新繪製。