在actionperformed java中运行代码时执行多个任务

在actionperformed java中运行代码时执行多个任务,java,swing,concurrency,Java,Swing,Concurrency,假设我有一个连接到按钮的侦听器。当我按下此按钮时,将调用actionPerformed,并将标签设置为可见。然后运行calculate()。然后我想用show()方法打印结果 事实上,我知道在执行actionPerformed中的所有代码之后,标签将设置为可见 所以我的问题是:如何设置calculate方法在后台运行?线程?斯威格梯默?SwingWorker?我还没有找到一个理想的方法 class ButtonListener implements ActionListener{ @O

假设我有一个连接到按钮的侦听器。当我按下此按钮时,将调用actionPerformed,并将标签设置为可见。然后运行
calculate()。然后我想用
show()
方法打印结果

事实上,我知道在执行
actionPerformed
中的所有代码之后,标签将设置为可见

所以我的问题是:如何设置
calculate
方法在后台运行?线程?斯威格梯默?SwingWorker?我还没有找到一个理想的方法

class ButtonListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        calculateLbl.setVisible(true);
        calculate();           
        show();
    }
}

您的问题之一是Swing并发性:在Swing事件线程上调用calculate()时,长时间运行的代码会妨碍事件线程,阻止它绘制到JLabel。解决方案是在后台线程中运行calculate,然后在完成时收到通知。出现通知时,调用
show()
。SwingWorker可以很好地实现这一点,因为它有自己的通知机制

e、 g

@覆盖
已执行的公共无效操作(操作事件e){
calculateLbl.setVisible(真);
新SwingWorker(){
public Void doInBackground()引发异常{
calculate();//这是在后台线程中运行的
//注意不要让calculate发出Swing呼叫
返回null;
}
受保护的void done(){
show();//这在Swing事件线程上运行
}
}.execute();
}
警告:代码未测试/编译/也未运行


上述代码的一个问题是,它不会处理calculate方法中可能引发的任何异常,更好的方法是创建一个SwingWorker变量,将PropertyChangeListener附加到该变量,当其SwingWorker.StateValue为SwingWorker.StateValue.DONE时,调用
get()
在SwingWorker上,并在那里处理任何可能的异常。

感谢您的回复,示例代码帮助我了解了如何开始,现在我可以对其进行更多编辑并继续。您能告诉我一种方法,在运行
计算()
时,我可以调用
show()
在框架中打印结果吗?例如,它可以在
calculate
循环中每100次运行一次。@Breattaker:看看在SwingWorker中使用发布/流程,包括查看以及搜索此站点。例如,看一看容易找到的答案。@Breattaker:特别是,请查看以下答案链接:。
@Override
public void actionPerformed(ActionEvent e) {
    calculateLbl.setVisible(true);
    new SwingWorker<Void, Void>() {
        public Void doInBackground() throws Exception{
            calculate(); // this is run in a background thread
                         // take care that calculate makes no Swing calls
            return null;
        }

        protected void done() {
            show();  // this is run on the Swing event thread
        }
    }.execute();
}