Java の SwingWorker
イベント ディスパッチ スレッド (EDT) をブロックせずに Swing で長時間実行タスクを実行するには、SwingWorker の利用を検討してください。この記事は、「Java の別のクラスからの repaint の呼び出し」に関する以前の質問に関連する特定の使用例に対処することを目的としています。
SwingWorker について
SwingWorker を使用すると、タスクを非同期的に実行し、GUI の応答性を維持します。バックグラウンド タスクと EDT の間のデータ交換を処理します。
Java で SwingWorker を実装する
前のコードからヒントを得た次のコード スニペットを考えてみましょう。質問:
// **illustrates previous example** import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.SwingWorker; public class SwingWorkerExample { private static void main(String[] args) { // Initialize GUI JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); // Create and add a button to trigger the SwingWorker JButton button = new JButton("Start Async Task"); panel.add(button); f.add(panel); f.pack(); f.setVisible(true); // SwingWorker to perform the task SwingWorker<Integer, Void> worker = new SwingWorker<Integer, Void>() { // executed on a background thread: @Override protected Integer doInBackground() throws Exception { // simulate a heavy task: Thread.sleep(3000); // replace with actual code... return 42; // return an integer result... } // executed on the EDT after doInBackground completes: @Override protected void done() { try { // get the result of the SwingWorker: int result = get(); } catch (Exception ex) { ex.printStackTrace(); } } }; // ActionListener for the button: button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // start the SwingWorker when the button is clicked: worker.execute(); } }); } }
説明:
以上がJava で長時間実行されるタスクを実行するときに、SwingWorker はイベント ディスパッチ スレッドのブロックをどのように防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。