2016-10-04 109 views
1

我有許多按鈕,點擊時會運行腳本,如果成功,則會使用Swing在GUI上的文本字段中生成通過/失敗消息。我注意到,即使在點擊一個新按鈕來運行腳本後,仍然會顯示以前結果的文本。顯示該文本直到腳本完成,生成一個新的結果然後顯示。在Swing中的按鈕單擊操作上的清除文本框

我想添加一些代碼,以便在單擊新按鈕時,文本字段將被重置,並且在腳本完成之前不會顯示任何文本。

A按鈕:

Test1 = new JButton("Test1"); 
    Test1.setLocation(290, 30); 
    Test1.setSize(120, 30); 
    Test1.addActionListener(this); 
    Test1.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent e) { 
      if (Test1.isEnabled()) { 
       errorLabel.setText(""); 
       result = JUnitCore.runClasses(Test1.class); 
       errorMessageDisplay(result); 
      } 
     } 
    }); 
    buttonPanel.add(Test1); 

爲錯誤消息中的代碼:

public void errorMessageDisplay(Result resultPass) { 
    errorLabel.addMouseListener(new MouseAdapter(){ 
     @Override 
     public void mouseClicked(MouseEvent e){ 
      errorLabel.setText(""); 
      errorLabel.setVisible(true); 
     } 
    }); 


    if (result.getFailureCount() > 0) { 
     errorLabel.setForeground(Color.red); 
     errorLabel.setVisible(true); 
     errorLabel.setText(" Failed"); 
    } 

    else { 
     errorLabel.setForeground(Color.green); 
     errorLabel.setText(" Passed"); 
     errorLabel.setVisible(true); 
    } 
} 
+0

你需要在不同的線程上運行你的測試,你阻止了gui線程(EDT)。另外,爲什麼每次調用errorMessageDisplay時都會創建一個偵聽器? – matt

+0

事情是,我想一次只能運行1個測試。我不需要創建一個新的Lisener嗎? –

+0

我不知道爲什麼你需要一個新的偵聽器,它看起來像這個只清除文本,並將標籤設置爲可見。它應該已經可見,如果你點擊它。你只是積累了可以做同樣事情的聽衆。 – matt

回答

0

最簡單的解決方案是創建另一個線程。

if (Test1.isEnabled()) { 
    errorLabel.setText(""); 
    new Thread(()->{ 
     Result result = JUnitCore.runClasses(Test1.class); 
     EventQueue.invokeLater(()->errorMessageDisplay(result)); 
    }).start(); 
} 

這不是一個很好的解決方案,考慮使用一個SwingWorker或ExecutorService的。

使用執行程序服務的一個簡單示例是在您啓動時創建執行程序。

ExecutorService service = Executors.newSingleThreadExecutor(); 

然後提交工作。

if (Test1.isEnabled()) { 
    errorLabel.setText(""); 
    service.submit(()->{ 
     Result result = JUnitCore.runClasses(Test1.class); 
     EventQueue.invokeLater(()->errorMessageDisplay(result)); 
    }); 
} 

這將允許您提交多個工作,但他們會連續運行。你也可以通過gui來控制工作流程。

if (Test1.isEnabled()) { 
    test1.setEnabled(false); 
    errorLabel.setText(""); 
    service.submit(()->{ 
     Result result = JUnitCore.runClasses(Test1.class); 
     EventQueue.invokeLater(()->{ 
      errorMessageDisplay(result); 
      test1.setEnabled(true); 
     }); 
    }); 
} 
+0

如果我創建另一個線程,這意味着您可以並行運行多個測試嗎? –

+0

是的,你可以並行運行多個事物。如果這是你的目標,我肯定會建議尋找執行者服務。所以你可以控制它們如何更好地執行。 – matt

+0

我不能並行運行的東西不幸的是嗯 –

相關問題