Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mengemas kini JLabel Secara Berterusan dengan Keputusan Tugasan Berjangka Panjang?

Bagaimana untuk Mengemas kini JLabel Secara Berterusan dengan Keputusan Tugasan Berjangka Panjang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-24 05:06:30540semak imbas

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

Kemas kini JLabel dengan Keputusan Tugasan Jangka Panjang

Masalah:

Anda berhasrat untuk cipta program yang terus ping pelayan dan mengemas kini hasil ping dalam JLabel.

Pendekatan Awal:

Percubaan pertama anda melibatkan memanggil kaedah setPing() sekali dalam acara formWindowOpened(). Walaupun ini berjaya, ia hanya melaksanakan tugas sekali sahaja.

Pendekatan Kedua:

Usaha seterusnya memperkenalkan gelung tak terhingga dalam formWindowOpened(). Walau bagaimanapun, pendekatan ini gagal melaksanakan kaedah setPing() sekali pun.

Penyelesaian menggunakan Swing Timer dan SwingWorker:

Untuk menangani isu ini, pertimbangkan untuk menggunakan Swing Timer untuk menjadualkan pelaksanaan tugas yang sudah lama berjalan (dalam kes ini, kaedah setPing()) pada selang masa yang telah ditetapkan. Pendekatan ini memanfaatkan SwingWorker untuk melaksanakan kaedah setPing() pada urutan yang berasingan, mendayakan responsif dan mengelakkan pembekuan GUI.

Berikut ialah coretan kod yang melaksanakan pendekatan ini:

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

Dalam ini kod:

  • Swing Timer berulang kali menjadualkan pelaksanaan PingWorker.
  • SwingWorker melaksanakan setPing() di latar belakang, mengemas kini GUI apabila selesai.

Pendekatan ini memastikan bahawa tugasan yang berjalan lama tidak menyekat urutan GUI, mengekalkan responsif semasa mengemas kini JLabel dengan hasil ping pada selang masa yang tetap.

Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini JLabel Secara Berterusan dengan Keputusan Tugasan Berjangka Panjang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn