當圖像從Web 載入到面板時,GUI 可以凍結直到載入過程完成。這可能會讓用戶感到煩惱。
為了避免 GUI 凍結,請考慮使用 javax.swing.SwingWorker。該類別支援在保持 GUI 執行緒處於活動狀態的同時後台載入映像。
以下範例示範如何使用SwingWorker 載入映像:
import java.awt.*; import java.io.IOException; import java.net.URL; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.*; public final class WorkerTest extends JFrame { private final JLabel label = new JLabel("Loading..."); public WorkerTest() { 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(() -> { WorkerTest wt = new WorkerTest(); wt.setVisible(true); wt.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"); WorkerTest.this.pack(); WorkerTest.this.setLocationRelativeTo(null); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } } }
在此例如:
透過使用 SwingWorker,可以運行圖像載入過程在後台,允許 GUI 在獲取和顯示圖像時保持響應。
以上是在 Swing 中載入圖像時如何避免 GUI 凍結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!