2017-10-17 57 views
0

我正在使用本質上是文件移動程序的代碼。我試圖做的是在用戶點擊調用文件移動器的提交按鈕後,按鈕的文本將變爲「正在工作」。我有一個基本的理解,爲什麼它不工作時,我只是設置它,但我試圖使用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

回答

0

我設法解決了這個問題,將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."); 
      } 
     } 
    });