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

为了进一步阐述,我有一个看起来像这样的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)。 有没有办法打击这个?

每次从GUI执行逻辑时,您应该以下列方式使用SwingWorker:

 SwingWorker myWorker= new SwingWorker() { @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 。 链接到相关答案

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

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

你在处理GUI的同一个线程上做了一些处理吗? 您可能希望查看SwingWorker线程以在后台执行繁重的操作,以便您的UI保持响应(如果是这样)。

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

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

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

请查看文档以获取介绍。

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

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