Home  >  Article  >  Java  >  How to Continuously Update JLabel with Results of Long-Running Task?

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

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

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

Update JLabel with Results of Long-Running Task

Problem:

You aim to create a program that continuously pings a server and updates the ping results in a JLabel.

Initial Approach:

Your first attempt involved calling the setPing() method once within the formWindowOpened() event. While this worked, it only performed the task once.

Second Approach:

Subsequent efforts introduced an infinite loop within formWindowOpened(). However, this approach failed to execute the setPing() method even once.

Solution using Swing Timer and SwingWorker:

To address this issue, consider utilizing a Swing Timer to schedule the execution of a long-running task (in this case, the setPing() method) at predefined intervals. This approach leverages a SwingWorker to execute the setPing() method on a separate thread, enabling responsiveness and avoiding GUI freezing.

Here's a code snippet that implements this approach:

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

In this code:

  • Swing Timer repeatedly schedules the execution of the PingWorker.
  • SwingWorker executes setPing() in the background, updating the GUI on completion.

This approach ensures that the long-running task does not block the GUI thread, maintaining responsiveness while updating the JLabel with ping results at regular intervals.

The above is the detailed content of How to Continuously Update JLabel with Results of Long-Running Task?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn