首頁 >Java >java教程 >SwingWorker 如何提升 Java Swing 應用程式的回應能力?

SwingWorker 如何提升 Java Swing 應用程式的回應能力?

Patricia Arquette
Patricia Arquette原創
2024-12-06 07:57:13910瀏覽

How can SwingWorker Improve Responsiveness in Java Swing Applications?

在 Java 中實作 SwingWorker

在之前關於從另一個類別重繪的問題中,提到了 SwingWorker 的概念。本文旨在詳細闡述 SwingWorker 的使用,特別是在原始問題中提供的程式碼片段的上下文中。

理解 SwingWorker

SwingWorker 是一個實用程式類別在 Java 中,它有助於在 Swing 應用程式中執行耗時的任務。它允許在單獨的執行緒上執行這些任務,從而防止 GUI 鎖定。

實作 SwingWorker

使用 SwingWorker,這是一個擴展它的新類別應該被建立。在此類中,應實現以下內容:

  1. doInBackground():此方法包含長時間運行的任務。它在單獨的線程上運行。
  2. done():當 doInBackground() 方法完成時呼叫此方法。用於處理任務結果並更新GUI。

例如:

class AnswerWorker extends SwingWorker<Integer, Integer> {

    @Override
    protected Integer doInBackground() throws Exception {
        // Perform a time-consuming task here.
        Thread.sleep(1000);
        return 42;
    }

    @Override
    protected void done() {
        try {
            // Display the result of the task in a message box.
            JOptionPane.showMessageDialog(f, get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

呼叫SwingWorker

要呼叫 SwingWorker,請呼叫其execute() 方法。通常,這可以透過事件處理程序(例如ActionListener)來完成:

JButton b = new JButton("Answer!");
b.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        new AnswerWorker().execute();
    }
});

範例:

以下程式碼示範如何在簡單的範例中使用SwingWorker GUI 應用程式:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;

public class SwingWorkerExample {

    public static void main(String[] args) {
        makeGUI();
    }

    private static void makeGUI() {
        final JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new FlowLayout());

        // Create and invoke SwingWorker.
        JButton answerButton = new JButton("Answer!");
        answerButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new AnswerWorker().execute();
            }
        });

        f.getContentPane().add(answerButton);
        f.pack();
        f.setVisible(true);
    }

    private static class AnswerWorker extends SwingWorker<Integer, Integer> {

        @Override
        protected Integer doInBackground() throws Exception {
            // Perform a time-consuming task.
            Thread.sleep(1000);
            return 42;
        }

        @Override
        protected void done() {
            try {
                // Display the result of the task in a message box.
                JOptionPane.showMessageDialog(f, get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

以這種方式使用SwingWorker,GUI保持回應,而耗時的任務是後台的eseguito。

以上是SwingWorker 如何提升 Java Swing 應用程式的回應能力?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn