Heim  >  Artikel  >  Java  >  Wie aktualisiere ich ein JLabel kontinuierlich mit lang andauernden Aufgabenergebnissen?

Wie aktualisiere ich ein JLabel kontinuierlich mit lang andauernden Aufgabenergebnissen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-24 02:35:29662Durchsuche

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

JLabel wiederholt mit Ergebnissen einer lang laufenden Aufgabe aktualisieren

Problem:

Ein Java-Programm versucht, ein JLabel kontinuierlich mit den Ergebnissen einer lang laufenden Aufgabe (Pingen eines Servers) zu aktualisieren. Während die anfängliche Implementierung die Aufgabe nur einmal ausführte, schlägt der Versuch, eine wiederkehrende Aufgabe zu erstellen, fehl.

Lösung:

Um dieses Problem zu beheben, verwendet das Programm zwei Techniken:

  1. Swing-Timer für sich wiederholende Aufgaben: Der ActionListener im Timer ruft wiederholt eine Aufgabe mit einer angegebenen Verzögerung auf. Dieser Ansatz wird hier angewendet, um die lang laufende Aufgabe auszulösen.
  2. SwingWorker für lang laufende Aufgaben: Die SwingWorker-Klasse bietet einen Mechanismus zum Ausführen lang laufender Aufgaben in einem Hintergrundthread, ohne den zu blockieren Hauptthread (Event Dispatch). In diesem Zusammenhang wird der PingWorker verwendet, um die Ping-Aufgabe auszuführen.

Code-Snippet:

Der folgende Code kombiniert diese Techniken, um das gewünschte Verhalten zu erreichen:

<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>

Erklärung:

  1. Der ActionListener im Timer löst die Ausführung der SwingWorker-Aufgabe (PingWorker) alle Verzögerungsmillisekunden aus.
  2. Der PingWorker führt die lang laufende Ping-Aufgabe im Hintergrund aus und gibt nach Abschluss die Ping-Zeit zurück.
  3. Nach Abschluss aktualisiert die done()-Methode in PingWorker das JLabel mit dem Ergebnis.
  4. Die pingTime()-Methode stellt eine Socket-Verbindung zum angegebenen Host her, um die Ping-Zeit zu messen.

Diese Implementierung stellt sicher, dass das JLabel wiederholt mit der neuesten Ping-Zeit aktualisiert wird, ohne die Reaktionsfähigkeit der GUI zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie aktualisiere ich ein JLabel kontinuierlich mit lang andauernden Aufgabenergebnissen?. 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