ボタンをクリックすると、Web から画像が読み込まれて表示されます別の JFrame 内のパネル。ただし、これにより、画像の読み込みプロセス中にアプリケーション ウィンドウが一時的にフリーズします。
この問題は、ボタンのクエリがイベント ディスパッチ スレッド (EDT) で実行されるために発生します。このスレッドはすべての GUI 更新の処理を担当するため、このスレッドがブロックされると、アプリケーションは応答しなくなります。
フリーズを回避するには、画像をバックグラウンドでロードする必要があります。 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(); } } } }
このコードでは:
以上がSwingWorker を使用して GUI をフリーズさせずに画像を表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。