Wenn auf eine Schaltfläche geklickt wird, wird ein Bild aus dem Web geladen und angezeigt ein Panel innerhalb eines anderen JFrame. Dies führt jedoch dazu, dass das Anwendungsfenster während des Bildladevorgangs vorübergehend einfriert.
Das Problem tritt auf, weil die Abfrage der Schaltfläche im Event Dispatch Thread (EDT) ausgeführt wird. Dieser Thread ist für die Verarbeitung aller GUI-Updates verantwortlich. Wenn er also blockiert ist, reagiert die Anwendung nicht mehr.
Um ein Einfrieren zu vermeiden, sollte das Bild währenddessen im Hintergrund geladen werden Die GUI bleibt reaktionsfähig. Dies kann mit der Klasse javax.swing.SwingWorker erreicht werden.
SwingWorker ist eine Thread-sichere Klasse, die die Ausführung von Aufgaben im Hintergrund ermöglicht, ohne den EDT zu blockieren. Es bietet Methoden zum Festlegen der auszuführenden Aufgabe und zum anschließenden Ausführen in einem separaten Thread.
Hier ist ein Beispiel dafür, wie Sie mit SwingWorker ein Bild anzeigen können, ohne die GUI einzufrieren:
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(); } } } }
In diesem Code:
Das obige ist der detaillierte Inhalt vonWie zeige ich mit SwingWorker ein Bild an, ohne die GUI einzufrieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!