Java的Swing Threading
2022-09-04 08:25:01
我的理解是,如果我启动另一个线程来执行某些操作,我将需要在所述线程中或更新GUI。如果我错了,请纠正我。SwingUtilities.invokeAndWait
SwingUtilities.invokeLater
我试图完成的相对简单:当用户单击提交时,我想(在执行任何操作之前)禁用提交按钮,执行操作,然后在操作结束时重新启用按钮。我执行操作的方法在获取结果时直接更新 GUI(显示结果)。
此操作基本上查询服务器并获取一些结果。
到目前为止,我所拥有的是:
boolean isRunning = false;
synchronized handleButtonClick() {
if ( isRunning == false ) {
button.setEnabled( false );
isRunning = true;
doAction();
}
}
doAction() {
new Thread() {
try {
performAction(); // Concern A
} catch ( ... ) {
displayStackTrace( ... ); // Concern B
} finally {
SwingUtilities.invokeLater ( /* simple Runnable to enable button */ );
isRunning = false;
}
}
}
对于我上面的两个问题,我是否必须使用它们,因为它们都会更新GUI?所有 GUI 更新都围绕更新 。我是否需要在我的线程中检查我是否在EDT上,如果是这样,我可以调用我的代码(无论它是否更新GUI)并且不使用?SwingUtilities.invokeAndWait
JTextPane
SwingUtilities.invokeAndWait
编辑:这是我现在正在做的事情:
handleButtonClick() {
if ( isRunning == true )
return;
disable button;
SwingWorker task = new MyTask();
task.execute();
}
...inside MyTask
doInBackground() {
return performAction();
}
done() {
result = get();
enable button;
isRunning = false;
interpret result (do most of the GUI updates here);
}
虽然做了一些GUI更新,但我已经将它们包装在:performAction()
if ( SwingUtil.isEDT() )
doGUIupdate()
else
SwingUtil.invokeLater( new Runnable() {
run() {
doGUIupdate();
}
} );
希望这是朝着正确方向迈出的一步,如果您认为有更好的方法来处理我的情况,请发表评论。