GUI在运行ActionEvent之前无法直观更新

时间:2013-07-31 15:45:58

标签: java swing user-interface swingworker actionevent

为了进一步阐述,我有一个看起来像这样的GUI:

enter image description here

然后我在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...

理论上,这应该会发生这种情况:

enter image description here

然而,相反,我得到以下内容,直到完成连接到OK按钮的所有方法和其他内容:

enter image description here

这显然不可能发生,因为我们的想法是让取消按钮可用,并且OK按钮和其他几个勾选框在程序的持续时间内不可用(图2),相反,它冻结在半状态(图3)。有没有办法打击这个?

4 个答案:

答案 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保持响应。

修改

如果这更符合您的需求,您也可以使用invokeAndWaitLink to related answer

答案 1 :(得分:3)

  

//在这里转到一系列其他方法......

确保不使用长时间运行的操作阻止GUI线程(EDT)。而是使用SwingWorker

答案 2 :(得分:3)

您是否在处理GUI的同一线程上进行了一些处理?您可能希望查看SwingWorker线程以在后台执行重要操作,以便您的UI保持响应状态。

答案 3 :(得分:3)

是的,那是因为你用其他方法阻止了EDT。

您需要使用另一个Thread在后​​台完成工作,否则GUI将被阻止。

在Swing应用程序中,建议在SwingWorker上执行任何长时间运行的任务。

看一下documentation的介绍。

SwingWorker将执行给定的任务,并在完成后报告回GUI。这将以非阻塞方式完成,以便您可以在执行任务时使用GUI。

如果您希望能够取消后台任务,则需要保留对SwingWorker的引用,以便您可以调用cancel方法。在这种情况下,工作方法需要是可中断的,否则无法取消任务。