如何使用 SwingWorker 顯示影像而不凍結 GUI?
如何在不凍結GUI 的情況下顯示圖像
問題
單擊按鈕時,將從網絡加載圖像並顯示在另一個JFrame 中的面板。但是,這會導致應用程式視窗在圖像載入過程中暫時凍結。
原因
出現此問題的原因是按鈕的查詢是在事件調度執行緒 (EDT) 上執行的。該線程負責處理所有 GUI 更新,因此當它被阻塞時,應用程式將變得無響應。
解決方案:使用 SwingWorker
為避免凍結,應在後台載入影像,同時GUI 保持回應。這可以使用 javax.swing.SwingWorker 類別來實現。
SwingWorker 是一個執行緒安全的類,允許在後台執行任務而不會阻塞 EDT。它提供了設定要執行的任務,然後在單獨的線程中執行它的方法。
實作
以下是如何使用SwingWorker 在不凍結GUI 的情況下顯示影像的範例:
import java.util.concurrent.ExecutionException; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.net.URL; public class ImageDisplaySwingWorker extends JFrame { private JLabel label = new JLabel("Loading..."); public ImageDisplaySwingWorker() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); this.add(label); this.pack(); this.setLocationRelativeTo(null); } private void start() { new ImageWorker().execute(); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ImageDisplaySwingWorker imageDisplaySwingWorker = new ImageDisplaySwingWorker(); imageDisplaySwingWorker.setVisible(true); imageDisplaySwingWorker.start(); } }); } class ImageWorker extends SwingWorker<Image, Void> { private static final String TEST = "http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png"; @Override protected Image doInBackground() throws IOException { Image image = ImageIO.read(new URL(TEST)); return image.getScaledInstance(640, -1, Image.SCALE_SMOOTH); } @Override protected void done() { try { ImageIcon icon = new ImageIcon(get()); label.setIcon(icon); label.setText("Done"); ImageDisplaySwingWorker.this.pack(); ImageDisplaySwingWorker.this.setLocationRelativeTo(null); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } } }
在此程式碼中:
- 標籤用於顯示
- 呼叫start() 方法來啟動映像載入過程。
- ImageWorker 類別擴展了 SwingWorker 並定義了 doInBackground() 方法,該方法在單獨的線程中載入映像。
- 圖片載入完成時呼叫done()方法。它將圖像設定為標籤的圖標並更新 GUI。
以上是如何使用 SwingWorker 顯示影像而不凍結 GUI?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

在使用IntelliJIDEAUltimate版本啟動Spring...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...
