Rumah > Java > javaTutorial > teks badan

Bagaimana untuk Mengemas kini JLabel Secara Berterusan dengan Keputusan Tugasan Berlangsung Lama?

Barbara Streisand
Lepaskan: 2024-10-24 02:35:29
asal
662 orang telah melayarinya

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

Kemas kini JLabel Berulang Kali dengan Keputusan Tugasan Yang Berlangsung Lama

Masalah:

Aturcara Java cuba mengemas kini JLabel secara berterusan dengan hasil tugasan yang telah berjalan lama (ping pelayan). Walaupun pelaksanaan awal hanya melaksanakan tugas sekali, percubaan untuk mencipta tugasan berulang gagal berfungsi.

Penyelesaian:

Untuk menangani isu ini, program menggunakan dua teknik:

  1. Pemasa Ayunan untuk Tugasan Berulang: Pendengar Tindakan dalam Pemasa berulang kali memanggil tugas pada kelewatan yang ditentukan. Pendekatan ini digunakan di sini untuk mencetuskan tugasan yang berjalan lama.
  2. SwingWorker untuk Tugasan Jangka Panjang: Kelas SwingWorker menyediakan mekanisme untuk melaksanakan tugasan yang berjalan lama dalam urutan latar belakang tanpa menyekat utas utama (Penghantaran Acara). Dalam konteks ini, PingWorker digunakan untuk melaksanakan tugas ping.

Snippet Kod:

Kod berikut menggabungkan teknik ini untuk mencapai gelagat yang diingini:

<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>
Salin selepas log masuk

Penjelasan:

  1. ActionListener dalam Pemasa mencetuskan pelaksanaan tugas SwingWorker (PingWorker) setiap milisaat kelewatan.
  2. PingWorker melaksanakan tugas ping yang telah lama berjalan di latar belakang, mengembalikan masa ping setelah selesai.
  3. Setelah selesai, kaedah done() dalam PingWorker mengemas kini JLabel dengan hasilnya.
  4. Kaedah pingTime() mewujudkan sambungan soket ke hos yang ditentukan untuk mengukur masa ping.

Pelaksanaan ini memastikan JLabel dikemas kini berulang kali dengan masa ping terkini tanpa menghalang responsif GUI.

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

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!