ホームページ  >  記事  >  Java  >  長時間実行されるタスクの結果を使用して JLabel を継続的に更新するにはどうすればよいですか?

長時間実行されるタスクの結果を使用して JLabel を継続的に更新するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-24 02:35:29662ブラウズ

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

長時間実行タスクの結果で JLabel を繰り返し更新する

問題:

Java プログラム長時間実行タスク (サーバーへの ping) の結果を使用して JLabel を継続的に更新しようとします。最初の実装ではタスクが 1 回だけ実行されましたが、繰り返しタスクを作成しようとしても機能しません。

解決策:

この問題に対処するために、プログラムは 2 つのタスクを利用します。テクニック:

  1. タスクを繰り返すためのスイング タイマー: タイマー内の ActionListener は、指定された遅延でタスクを繰り返し呼び出します。このアプローチは、長時間実行タスクをトリガーするためにここで適用されます。
  2. 長時間実行タスク用の SwingWorker: SwingWorker クラスは、バックグラウンド スレッドで長時間実行タスクをブロックせずに実行するメカニズムを提供します。メイン (イベントディスパッチ) スレッド。このコンテキストでは、PingWorker は ping タスクの実行に使用されます。

コード スニペット:

次のコードは、これらの手法を組み合わせて、目的の動作を実現します。

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

説明:

  1. タイマーの ActionListener は、遅延ミリ秒ごとに SwingWorker タスク (PingWorker) の実行をトリガーします。
  2. PingWorker は、長時間実行される ping タスクをバックグラウンドで実行し、完了すると ping 時間を返します。
  3. 完了すると、PingWorker の Done() メソッドは、結果で JLabel を更新します。
  4. pingTime() メソッドは、ping 時間を測定するために、指定されたホストへのソケット接続を確立します。

この実装により、GUI の応答性を妨げることなく、JLabel が最新の ping 時間で繰り返し更新されることが保証されます。

以上が長時間実行されるタスクの結果を使用して JLabel を継続的に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。