Home >Java >javaTutorial >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:
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!