gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:48:35 26 4
gpt4 key购买 nike

假设我有一个监听器连接到一个按钮。当我按下此按钮时,将调用 actionPerformed 并将 label 设置为可见。然后 calculate() 方法运行(其中有一些非常长的计算,它需要时间)。然后我想用 show() 方法打印结果。

事实是,我知道 label 将在 actionPerformed 中的所有代码执行后设置为 visible

所以我的问题是:我应该如何设置 calculate 方法在后台运行?线程? Swing 计时器? Swing worker ?目前还没有找到理想的方式。

class ButtonListener implements ActionListener{

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

最佳答案

您的问题是 Swing 并发性之一:在 Swing 事件线程上调用 calculate() 时,长时间运行的代码会阻碍事件线程,阻止它绘制到 JLabel。解决方案是在后台线程中运行计算,然后在完成时收到通知。当通知发生时,调用 show()。 SwingWorker 会非常适合这个,因为它带有自己的通知机制。

例如,

@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();
}

警告:代码未经测试/编译/也未运行。

上面代码的一个问题是它不处理任何可能在计算方法中抛出的异常,一个更清晰更好的方法是创建一个 SwingWorker 变量,将 PropertyChangeListener 附加到它,并且当它SwingWorker.StateValue 是 SwingWorker.StateValue.DONE,在 SwingWorker 上调用 get() 并在那里处理任何可能的异常。

关于java - 在 actionperformed java 中运行代码时执行多个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36293795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com