Verwendung von Swing Timer und SwingWorker für sich wiederholende und lang laufende Aufgaben in der GUI
In einer grafischen Benutzeroberfläche (GUI), Pflege der Die Reaktionsfähigkeit der Anwendung ist entscheidend. Das Ausführen lang andauernder oder sich wiederholender Aufgaben wie Netzwerkanrufe oder umfangreiche Berechnungen kann bei unsachgemäßer Handhabung zum Einfrieren der Benutzeroberfläche führen.
Swing-Timer für sich wiederholende Aufgaben
Für Aufgaben die sich in regelmäßigen Abständen wiederholen müssen (z. B. das Aktualisieren eines Etiketts mit Daten von einem Server), stellt Swing die Timer-Klasse bereit. Ein Timer kann mit einer Verzögerung und einem ActionListener konfiguriert werden, der die Aktionen definiert, die ausgeführt werden sollen, wenn der Timer ausgelöst wird.
SwingWorker für lang laufende Aufgaben
SwingWorker ist ein Swing Komponente, die SwingUtilities erweitert und für Aufgaben konzipiert ist, die einen längeren Zeitraum in Anspruch nehmen. Es ermöglicht Ihnen, die Aufgabe in einem Hintergrundthread auszuführen und gleichzeitig die Reaktionsfähigkeit der Benutzeroberfläche aufrechtzuerhalten. Wenn die Aufgabe abgeschlossen ist, benachrichtigt der SwingWorker den Hauptthread, um die Benutzeroberfläche mit dem Ergebnis zu aktualisieren.
Beispiel: Aktualisieren eines Labels mit Server-Ping-Ergebnissen
Zur Demonstration des Bei der kombinierten Verwendung von Timer und SwingWorker beachten Sie bitte den folgenden Codeausschnitt:
<code class="java">import javax.swing.*; import java.awt.event.*; import java.net.Socket; public class LabelUpdateExample { private static String hostnameOrIP = "stackoverflow.com"; private static int delay = 5000; private static JLabel label = new JLabel("0000"); public static void main(String[] args) { label.setFont(label.getFont().deriveFont(120f)); ActionListener timerListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new PingWorker().execute(); } }; Timer timer = new Timer(delay, timerListener); timer.start(); JOptionPane.showMessageDialog( null, label, hostnameOrIP, JOptionPane.INFORMATION_MESSAGE); timer.stop(); } private static class PingWorker extends SwingWorker { private int time; @Override protected Object doInBackground() throws Exception { time = pingTime(); return new Integer(time); } @Override protected void done() { label.setText("" + time); } } private static int pingTime() { Socket socket = null; long start = System.currentTimeMillis(); try { socket = new Socket(hostnameOrIP, 80); } catch (Exception weTried) { } finally { if (socket != null) { try { socket.close(); } catch (Exception weTried) {} } } long end = System.currentTimeMillis(); return (int) (end - start); } }</code>
Dieser Code erstellt ein JLabel, das die Ping-Zeit für einen angegebenen Host anzeigt und sie mithilfe eines Timers alle 5 Sekunden aktualisiert. Der Ping-Vorgang wird in einem Hintergrundthread mit SwingWorker ausgeführt, um ein Einfrieren der Benutzeroberfläche zu vermeiden. Wenn der Ping abgeschlossen ist, aktualisiert der SwingWorker die Bezeichnung mit dem Ergebnis und stellt so sicher, dass die GUI während der lang andauernden Aufgabe reaktionsfähig bleibt.
Das obige ist der detaillierte Inhalt vonWie verwende ich Swing Timer und SwingWorker für eine effiziente GUI-Aufgabenverwaltung in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!