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

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

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

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

Update JLabel Repeatedly with Results of Long Running Task

Problem:

A Java program attempts to continuously update a JLabel with the results of a long-running task (pinging a server). While the initial implementation only performed the task once, an attempt to create a repeating task fails to function.

Solution:

To address this issue, the program utilizes two techniques:

  1. Swing Timer for Repeating Tasks: The ActionListener within the Timer repeatedly invokes a task at a specified delay. This approach is applied here to trigger the long-running task.
  2. SwingWorker for Long Running Tasks: The SwingWorker class provides a mechanism to execute long-running tasks in a background thread without blocking the main (Event Dispatch) thread. In this context, the PingWorker is used to execute the pinging task.

Code Snippet:

The following code combines these techniques to achieve the desired behavior:

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

Explanation:

  1. The ActionListener in the Timer triggers the execution of the SwingWorker task (PingWorker) every delay milliseconds.
  2. The PingWorker executes the long-running pinging task in the background, returning the ping time once complete.
  3. Upon completion, the done() method in PingWorker updates the JLabel with the result.
  4. The pingTime() method establishes a socket connection to the specified host to measure the ping time.

This implementation ensures that the JLabel is updated repeatedly with the latest ping time without hindering the responsiveness of the GUI.

The above is the detailed content of How to Update a JLabel Continuously with Long-Running Task Results?. 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