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
方法。 在这种情况下,工作方法需要是可中断的,否则无法取消任务。