Heim  >  Artikel  >  Java  >  Wie aktualisiere ich JLabel kontinuierlich mit den Ergebnissen einer lang andauernden Aufgabe?

Wie aktualisiere ich JLabel kontinuierlich mit den Ergebnissen einer lang andauernden Aufgabe?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-24 05:06:30540Durchsuche

How to Continuously Update JLabel with Results of Long-Running Task?

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:

  • Swing Timer plant wiederholt die Ausführung des PingWorker.
  • SwingWorker führt setPing() im Hintergrund aus und aktualisiert die GUI nach Abschluss.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn