首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwingWorker结束,PropertyChangeListener监听,但我如何回到EDT?

SwingWorker是一个Java多线程编程技术,用于在后台线程中执行耗时的操作,而不会阻塞GUI线程。当SwingWorker完成其任务时,它会自动将结果传递给其PropertyChangeListener监听器。如果您想回到EDT(事件分发线程),可以使用SwingWorker的done()方法来触发一个事件,然后在EDT中处理该事件。

以下是一个示例代码:

代码语言:java
复制
SwingWorker worker = new SwingWorker() {
    @Override
    protected Object doInBackground() throws Exception {
        // 执行耗时操作
        Thread.sleep(2000);
        return null;
    }

    @Override
    protected void done() {
        super.done();
        // 触发结果事件
        try {
            Object result = get();
            if (result != null) {
                JOptionPane.showMessageDialog(null, result.toString(), "Result", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if ("state".equals(evt.getPropertyName())) {
            if (SwingWorker.StateValue.DONE.equals(evt.getNewValue())) {
                // 处理结果事件
                try {
                    Object result = get();
                    if (result != null) {
                        JOptionPane.showMessageDialog(null, result.toString(), "Result", JOptionPane.INFORMATION_MESSAGE);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
});

在这个示例中,我们创建了一个SwingWorker对象,并将其state属性设置为SwingWorker.StateValue.RUNNING。当SwingWorker完成其任务时,它会调用done()方法,该方法会触发一个PropertyChangeEvent事件,该事件将state属性设置为SwingWorker.StateValue.DONE。我们使用PropertyChangeListener监听器来处理该事件,并在事件处理器中调用get()方法来获取结果,并显示结果消息框。

如果您想在其他线程中调用SwingWorker,您可以在其他线程中创建一个SwingWorker对象,并将其传递给SwingWorkerexecute()方法,以便在后台线程中执行耗时的操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券