5

为了进一步说明,我有一个如下所示的 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 按钮的方法和其他事情:

在此处输入图像描述

这显然不可能发生,因为这个想法是让取消按钮可用,而确定按钮和其他几个复选框在程序期间不可用(图 2),相反,它冻结在半状态(图 3)。有什么办法可以对抗这种情况吗?

4

4 回答 4

7

每次从 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如果这更适合您的需求,您也可以使用。链接到相关答案

于 2013-07-31T16:01:42.660 回答
3

//这里继续进行一系列其他方法...

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

于 2013-07-31T15:48:37.593 回答
3

您是否在处理 GUI 的同一线程上进行一些处理?您可能希望查看一个SwingWorker线程来在后台执行繁重的工作,以便您的 UI 在这样的情况下保持响应。

于 2013-07-31T15:48:40.463 回答
3

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

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

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

查看文档以获取介绍。

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

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

于 2013-07-31T15:48:53.697 回答