为了进一步阐述,我有一个看起来像这样的GUI:
然后我在OK按钮上有一个动作监听器,它起始于:
//OK Button Action Listener
private void okButtonActionPerformed(ActionEvent e) {
//Enable/Disable Buttons
okButton.setEnabled(false);
cancelButton.setEnabled(true);
updateCheckbox.setEnabled(false);
//Move on to a series of other methods here...
理论上,这应该会发生这种情况:
然而,相反,我得到以下内容,直到完成连接到OK按钮的所有方法和其他内容:
这显然不可能发生,因为我们的想法是让取消按钮可用,并且OK按钮和其他几个勾选框在程序的持续时间内不可用(图2),相反,它冻结在半状态(图3)。有没有办法打击这个?
答案 0 :(得分:6)
每次从GUI执行逻辑时,您应该以下列方式使用SwingWorker:
SwingWorker myWorker= new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
//Execute your logic
return null;
}
};
myWorker.execute();
如果要从此逻辑内部更新GUI,请使用InvokeLater:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//To update your GUI
}
});
通过这种方式,您可以确保您的逻辑和GUI保持响应。
修改强>
如果这更符合您的需求,您也可以使用invokeAndWait
。 Link to related answer
答案 1 :(得分:3)
//在这里转到一系列其他方法......
确保不使用长时间运行的操作阻止GUI线程(EDT)。而是使用SwingWorker
。
答案 2 :(得分:3)
您是否在处理GUI的同一线程上进行了一些处理?您可能希望查看SwingWorker
线程以在后台执行重要操作,以便您的UI保持响应状态。
答案 3 :(得分:3)
您需要使用另一个Thread
在后台完成工作,否则GUI将被阻止。
在Swing应用程序中,建议在SwingWorker
上执行任何长时间运行的任务。
看一下documentation的介绍。
SwingWorker
将执行给定的任务,并在完成后报告回GUI。这将以非阻塞方式完成,以便您可以在执行任务时使用GUI。
如果您希望能够取消后台任务,则需要保留对SwingWorker
的引用,以便您可以调用cancel
方法。在这种情况下,工作方法需要是可中断的,否则无法取消任务。