JLabel mit Ergebnissen lang laufender Aufgaben aktualisieren
Problem:
Ihr Ziel ist es Erstellen Sie ein Programm, das kontinuierlich einen Server anpingt und die Ping-Ergebnisse in einem JLabel aktualisiert.
Erster Ansatz:
Ihr erster Versuch bestand darin, die setPing()-Methode einmal innerhalb aufzurufen das formWindowOpened()-Ereignis. Obwohl dies funktionierte, wurde die Aufgabe nur einmal ausgeführt.
Zweiter Ansatz:
Nachfolgende Bemühungen führten eine Endlosschleife innerhalb von formWindowOpened() ein. Bei diesem Ansatz konnte die setPing()-Methode jedoch nicht einmal ausgeführt werden.
Lösung mit Swing Timer und SwingWorker:
Um dieses Problem zu beheben, sollten Sie die Verwendung eines Swing Timers in Betracht ziehen um die Ausführung einer Aufgabe mit langer Laufzeit (in diesem Fall die Methode setPing()) in vordefinierten Intervallen zu planen. Dieser Ansatz nutzt einen SwingWorker, um die setPing()-Methode in einem separaten Thread auszuführen, was die Reaktionsfähigkeit ermöglicht und ein Einfrieren der GUI vermeidet.
Hier ist ein Codeausschnitt, der diesen Ansatz implementiert:
<code class="java">import java.awt.event.*; import javax.swing.*; import java.net.Socket; public class LabelUpdateUsingTimer { static String hostnameOrIP = "stackoverflow.com"; int delay = 5000; JLabel label = new JLabel("0000"); LabelUpdateUsingTimer() { 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(); } class PingWorker extends SwingWorker { int time; @Override protected Object doInBackground() throws Exception { time = pingTime(); return new Integer(time); } @Override protected void done() { label.setText("" + time); } }; public 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); } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { new LabelUpdateUsingTimer(); } }; SwingUtilities.invokeLater(r); } }</code>
Hier Code:
Dieser Ansatz stellt sicher, dass die lang laufende Aufgabe den GUI-Thread nicht blockiert, wodurch die Reaktionsfähigkeit erhalten bleibt und das JLabel in regelmäßigen Abständen mit Ping-Ergebnissen aktualisiert wird.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich JLabel kontinuierlich mit den Ergebnissen einer lang andauernden Aufgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!