GUI JButton没有按时更新

问题描述:

我正在使用本质上是文件移动程序的代码。我试图做的是在用户点击调用文件移动器的提交按钮后,按钮的文本将变为“正在工作”。我有一个基本的理解,为什么它不工作时,我只是设置它,但我试图使用SwingUtilities在后台调用它。但是,在显示任何更改之前,它仍然等待方法调用ft.FindSpot完成之后。GUI JButton没有按时更新

  public void actionPerformed(ActionEvent arg0) { 
      if(!textField.getText().equals("")) 
      { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         btnSubmit.setText("Working..."); 
        } 
       }); 
       //btnSubmit.setText("Working..."); 
       ft.FindSpot(textField.getText(), comboBox.getSelectedItem().toString(), progressBar); 

       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         btnSubmit.setText("Submit"); 
        } 
       }); 
      } 
      else 
      { 
       ft.warningMessage("The ISCII textbox cannot be blank."); 
      } 
     } 
    }); 
+3

使用[摇摆工人(https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html)做在后台线程漫长的过程。 [tutorial](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)显示了一个示例 – Frakcool

+1

在Swing Events线程上调用了'actionPerformed()'方法。因此,第一个'btnSubmit.setText(“working ...”)'不需要用'invokeLater()'调用。但是'ft.FindSpot'也在Swing Events Thread上运行,基本上阻塞它直到完成,因此也不会发生按钮的视觉更新。 – cello

+0

@MarshalAlessi这里是一个[示例](https://stackoverflow.com/questions/42256369/update-jlabel-text-after-opening-jdialog/42256976#42256976)它不是我的答案中的[mcve],但你可能需要问题的代码并在我提供的答案中使用我的建议。然而在这一刻,我无法提供一个示例,但可以在几个小时内尝试。 – Frakcool

我设法解决了这个问题,将ft.FindSpot放在invokeLater Swing Utilities函数中,以便从不同的线程调用它。

 btnSubmit.setFont(new Font("Verdana", Font.PLAIN, 12)); 
    btnSubmit.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if(!textField.getText().equals("")) 
      { 
      btnSubmit.setText("Working..."); 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         ft.FindSpot(textField.getText(), comboBox.getSelectedItem().toString(), progressBar); 
        } 
       }); 

       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         btnSubmit.setText("Submit"); 
        } 
       }); 
      } 
      else 
      { 
       ft.warningMessage("The ISCII textbox cannot be blank."); 
      } 
     } 
    });