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

Mary-Kate Olsen
リリース: 2024-10-24 05:06:30
オリジナル
552 人が閲覧しました

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

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

問題:

目的は次のとおりですサーバーに継続的に ping を実行し、JLabel で ping 結果を更新するプログラムを作成します。

最初のアプローチ:

最初の試みでは、setPing() メソッドを 1 回呼び出しました。 formWindowOpened() イベント。これは機能しましたが、タスクは 1 回しか実行されませんでした。

2 番目のアプローチ:

その後の作業により、formWindowOpened() 内に無限ループが発生しました。ただし、このアプローチでは setPing() メソッドの実行に一度も失敗しました。

Swing Timer と SwingWorker を使用した解決策:

この問題に対処するには、Swing Timer の利用を検討してください。事前定義された間隔で長時間実行タスク (この場合は setPing() メソッド) の実行をスケジュールします。このアプローチでは、SwingWorker を利用して setPing() メソッドを別のスレッドで実行し、応答性を高め、GUI のフリーズを回避します。

このアプローチを実装するコード スニペットは次のとおりです。

<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>
ログイン後にコピー

この中でコード:

  • Swing Timer は、PingWorker の実行を繰り返しスケジュールします。
  • SwingWorker はバックグラウンドで setPing() を実行し、完了時に GUI を更新します。

このアプローチにより、長時間実行タスクが GUI スレッドをブロックせず、一定の間隔で ping 結果で JLabel を更新しながら応答性を維持できます。

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

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!