在GUI 中使用Swing Timer 和SwingWorker 執行重複和長時間運行的任務
在圖形使用者介面(GUI) 中,維護應用程式的響應能力至關重要。執行長時間運行或重複的任務,例如網路呼叫或繁重的計算,如果處理不當,可能會凍結 UI。
用於重複任務的Swing 計時器
對於任務對於需要定期重複的操作(例如,使用來自伺服器的資料更新標籤),Swing 提供了Timer類。計時器可以設定一個延遲和一個定義計時器觸發時要執行的動作的 ActionListener。
用於長時間運行任務的 SwingWorker
SwingWorker 是一個 Swing擴展 SwingUtilities 的元件,專為需要較長時間的任務而設計。它允許您在後台執行緒中執行任務,同時保持 UI 回應。任務完成後,SwingWorker 通知主執行緒使用結果更新 UI。
範例:使用伺服器Ping 結果更新標籤
示範結合使用Timer 和SwingWorker,請考慮以下程式碼片段:
<code class="java">import javax.swing.*; import java.awt.event.*; import java.net.Socket; public class LabelUpdateExample { private static String hostnameOrIP = "stackoverflow.com"; private static int delay = 5000; private static JLabel label = new JLabel("0000"); public static void main(String[] args) { 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(); } private static class PingWorker extends SwingWorker { private int time; @Override protected Object doInBackground() throws Exception { time = pingTime(); return new Integer(time); } @Override protected void done() { label.setText("" + time); } } private 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); } }</code>
此程式碼建立一個JLabel,用於顯示指定主機的ping 時間,並使用計時器每5 秒更新一次。 ping 操作是在後台執行緒中使用 SwingWorker 執行的,以避免凍結 UI。 ping 完成後,SwingWorker 將使用結果更新標籤,確保 GUI 在長時間運行的任務期間保持回應。
以上是如何在Java中使用Swing Timer和SwingWorker進行高效率的GUI任務管理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!