我正在尝试学习SwingWorker,并且我正在运行和运行此简单代码,但是我无法弄清楚在任务完成时如何提示JOptionPane.showMessageDialog。我不得不试着

if (isDone())
    JOptionPane.showMessageDialog(null, "Task Complete");


在不同的位置,但是什么也无法工作。我读过我可能必须将它放在invokeLater()中才能在EDT中运行,我不确定如何实现它。

我试图将我的SwingWorker作为小组的班级成员,但是由于在侦听器中它会被实例化,所以无法实例化它。所以我得到一个空指针试图将if (task.isDone())放入我的invokeLater()中。

完成这项任务的正确方法是什么?

我在这里有一个SSCCE(您所要做的就是输入一个数字,它会将我的名字多次打印到一个文本区域)。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.*;

public class RepeatNameSwingWorker extends JPanel {

    private JProgressBar jpb = new JProgressBar(0, 100);
    private JTextArea jtaNames = new JTextArea(20, 50);
    private final JTextField jtfTimes = new JTextField(8);
    private final JButton jbtExecute = new JButton("Execute");
    private final JLabel jlblNumTimes = new JLabel("Enter number of times: ");

    public RepeatNameSwingWorker(){
        jpb.setStringPainted(true);

        jtaNames.setLineWrap(true);
        jtaNames.setWrapStyleWord(true);

        JPanel panel = new JPanel();
        panel.add(jlblNumTimes);
        panel.add(jtfTimes);
        panel.add(jbtExecute);

        setLayout(new BorderLayout());
        add(jpb, BorderLayout.NORTH);
        add(new JScrollPane(jtaNames), BorderLayout.CENTER);
        add(panel, BorderLayout.SOUTH);

        jbtExecute.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                RepeatNames task = new RepeatNames(
                        Integer.parseInt(jtfTimes.getText()), jtaNames);

                task.addPropertyChangeListener(new PropertyChangeListener(){
                    @Override
                    public void propertyChange(PropertyChangeEvent e) {
                        if ("progress".equals(e.getPropertyName())) {
                            jpb.setValue((Integer)e.getNewValue());
                        }
                    }
                });
                task.execute();
                if (task.isDone())
                    JOptionPane.showMessageDialog(null, "Task Complete");
            }
        });

    }

    static class RepeatNames extends SwingWorker<String, String>{
        int times;
        JTextArea result;

        public RepeatNames(int times, JTextArea result) {
            this.times = times;
            this.result = result;
        }

        @Override
        protected String doInBackground(){
            publishNames(times);

            return null;
        }

        @Override
        protected void done() {
            try {
                result.append(get().toString()); // Display in text field
            } catch (Exception ex) {
                result.append(ex.getMessage());
            }
        }

        @Override
        protected void process(List<String> list) {
            for (int i = 0; i < list.size(); i++) {
                result.append(list.get(i) + " ");
            }
        }

        private void publishNames(int n) {
            int count = 0;
            int number = 2;

            while (count <= n) {

                if (isPrime(number)) {
                    count++;
                    setProgress(100 * count / n);
                    publish("Paul");
                }
                number++;
            }
        }

        private static boolean isPrime(int number) {
            for (int divisor = 2; divisor <= number / 2; divisor++) {
                if (number % divisor == 0) {
                    return false;
                }
            }
            return true;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new RepeatNameSwingWorker());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationByPlatform(true);
                frame.pack();
                frame.setVisible(true);

            }
        });
    }
}

最佳答案

,但我不知道任务完成后如何提示JOptionPane.showMessageDialog


在done()方法中显示JOptionPane。

07-25 22:23