Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mengemas kini JLabel Secara Berterusan Menggunakan Pemasa Swing dan SwingWorker?

Bagaimana untuk Mengemas kini JLabel Secara Berterusan Menggunakan Pemasa Swing dan SwingWorker?

asal
2024-10-23 22:21:01218semak imbas

How to Continuously Update a JLabel Using Swing Timer and SwingWorker?

Menggunakan Swing Timer dan SwingWorker untuk Mengemas kini JLabel Secara Berterusan

Untuk mengemas kini JLabel secara kerap dengan hasil aktiviti yang memakan masa, adalah disyorkan untuk menggunakan kedua-dua Pemasa Swing dan SwingWorker. Pemasa Swing mengendalikan tugas berulang, manakala SwingWorker menguruskan usaha yang memakan masa. Berikut ialah contoh kod yang menggambarkan cara strategi ini berfungsi:

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

Untuk mendapatkan butiran lanjut mengenai Benang Penghantaran Acara dan melaksanakan tugas berulang atau lanjutan dalam GUI, sila rujuk dokumen Concurrency in Swing.

Cara Kod Berfungsi:

  1. Inisialisasi: Pembina LabelUpdateUsingTimer memulakan label bernama JLabel dan menetapkan fonnya.
  2. ActionListener dan Pemasa: ActionListener yang dipanggil timerListener dicipta dan ia akan mencetuskan pelaksanaan PingWorker setiap milisaat kelewatan. Objek Pemasa kemudiannya dimulakan menggunakan kelewatan dan pemasaListener sebagai argumen, dan ia kemudiannya dimulakan.
  3. JOptionPane: JLabel dipaparkan dalam kotak dialog JOptionPane dengan nama hosOrIP yang ditentukan.
  4. PingWorker: Kelas PingWorker, subkelas SwingWorker, melaksanakan operasi yang memakan masa dalam urutan latar belakang.
  5. Masa Ping: Kaedah pingTime menetapkan sambungan TCP kepada nama hosOrIP yang ditentukan dan mengira kependaman.

Dengan menggunakan teknik ini, anda boleh terus mengemas kini JLabel dengan hasil terkini tugas yang memakan masa, membolehkan pemantauan masa nyata dan pengguna interaksi.

Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini JLabel Secara Berterusan Menggunakan Pemasa Swing dan SwingWorker?. 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