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