ホームページ  >  記事  >  Java  >  Swing Timer と SwingWorker を使用して JLabel を継続的に更新するにはどうすればよいですか?

Swing Timer と SwingWorker を使用して JLabel を継続的に更新するにはどうすればよいですか?

オリジナル
2024-10-23 22:21:01218ブラウズ

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

Swing Timer と SwingWorker を使用して JLabel を継続的に更新する

時間のかかるアクティビティの結果で JLabel を定期的に更新するには、 Swing Timer と SwingWorker の両方を使用することをお勧めします。 Swing Timer は繰り返しのタスクを処理し、SwingWorker は時間のかかる作業を管理します。この戦略がどのように機能するかを示すサンプル コードを次に示します。

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

イベント ディスパッチ スレッドおよび GUI での反復タスクまたは拡張タスクの実行の詳細については、Swing の同時実行に関するドキュメントを参照してください。

コードの仕組み:

  1. 初期化: LabelUpdateUsingTimer コンストラクターは、label という名前の JLabel を初期化し、そのフォントを設定します。
  2. ActionListener と Timer: timerListener と呼ばれる ActionListener が作成され、遅延ミリ秒ごとに PingWorker の実行がトリガーされます。その後、遅延と timerListener を引数として使用して Timer オブジェクトが開始され、その後開始されます。
  3. JOptionPane: JLabel は、指定された hostnameOrIP を使用して JOptionPane ダイアログ ボックス内に表示されます。
  4. PingWorker: SwingWorker サブクラスである PingWorker クラスは、時間のかかる操作をバックグラウンド スレッドで実行します。
  5. Ping Time: pingTime メソッドは、

この手法を採用すると、時間のかかるタスクの最新の結果で JLabel を継続的に更新でき、リアルタイムの監視とユーザーの使用が可能になります。インタラクション。

以上がSwing Timer と SwingWorker を使用して JLabel を継続的に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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