Apabila butang diklik, imej dimuatkan dari web dan dipaparkan dalam panel dalam JFrame lain. Walau bagaimanapun, ini menyebabkan tetingkap aplikasi menjadi beku seketika semasa proses pemuatan imej.
Isu timbul kerana pertanyaan butang dilaksanakan pada utas penghantaran acara (EDT). Urutan ini bertanggungjawab untuk mengendalikan semua kemas kini GUI, jadi apabila ia disekat, aplikasi menjadi tidak responsif.
Untuk mengelakkan pembekuan, imej harus dimuatkan di latar belakang sementara GUI kekal responsif. Ini boleh dicapai menggunakan kelas javax.swing.SwingWorker.
SwingWorker ialah kelas selamat benang yang membenarkan pelaksanaan tugas di latar belakang tanpa menyekat EDT. Ia menyediakan kaedah untuk menetapkan tugasan untuk dilaksanakan dan kemudian melaksanakannya dalam urutan yang berasingan.
Berikut ialah contoh cara menggunakan SwingWorker untuk memaparkan imej tanpa membekukan 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(); } } } }
Dalam kod ini:
Atas ialah kandungan terperinci Bagaimana untuk Memaparkan Imej Tanpa Membekukan GUI Menggunakan SwingWorker?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!