ホームページ >Java >&#&チュートリアル >長時間実行されるタスクの結果で JLabel を継続的に更新するにはどうすればよいですか?
長時間実行タスクの結果で 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>
この中でコード:
このアプローチにより、長時間実行タスクが GUI スレッドをブロックせず、一定の間隔で ping 結果で JLabel を更新しながら応答性を維持できます。
以上が長時間実行されるタスクの結果で JLabel を継続的に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。