2016-10-04 107 views
0

我在GUI上有按鈕,可以在Selenium中單擊時執行測試。它們只能連續運行,目前已添加到EventQueue。我希望這樣,如果點擊一個按鈕並執行一個測試,它將禁用其他按鈕,以便其他測試不能添加到隊列中。在Swing中禁用GUI上的按鈕

目前的按鈕看起來像:

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()) { 
       Test1.setEnabled(false); 
       errorLabel.setText(""); 
       service.submit(()->{ 
        Result result = JUnitCore.runClasses(Test1.class); 
        EventQueue.invokeLater(()->{ 
         errorMessageDisplay(result); 
         Test1.setEnabled(true); 
        }); 
       }); 
      } 
     } 
    }); 
    buttonPanel.add(Test1); 

我已經使用了EventQueue,因爲它可以讓我在GUI重置更新通過/失敗的錯誤消息。

我該如何做到最好?

+0

什麼是你的代碼的問題嗎?如果你不需要禁用的效果,也就是說,如果一個按鈕是可點擊的而該動作什麼都不做,你可以使用共享信號量(例如鎖定對象)。 – Thomas

+1

你不應該以這種方式使用MouseListeners。這是ActionListeners的用途。首先,MouseListeners會忽略一個按鈕是否被禁用,而ActionListeners則不會。 –

+0

我的回答對你有幫助嗎?給我一些反饋,這樣我可以改進我的答案。 – xenteros

回答

2

您應該將ActionListener添加到您的按鈕。更重要的是,您應該使用命名約定,這也意味着對象的名稱應該以小寫字母開頭。大寫字母保留爲類和靜態字段(全部大寫)。以下代碼將ActionListener添加到您的JButton並在點擊後禁用它。如果這不是你想要的,我會在一會兒添加另一個版本。

test1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      test1.setEnabled(false); 
     } 
    }); 

在的情況下,要保持狀態的按鈕,但不要禁用它,下面的代碼可能是一個解決辦法:

private final static String ENABLED = "ENABLED"; 
private final static String DISABLED = "DISABLED"; 

public static void main(String[] args) { 
    Map<JButton, String> map = new HashMap<>(); 
    JButton test1 = new JButton(); 
    map.put(test1, ENABLED); 
    test1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (map.get(test1).equals(ENABLED)) { 
       //do something 
      } else { 
       //do something else. I'll enable. 
       map.remove(test1); 
       map.put(test1, ENABLED); 
      } 
     } 
    }); 

}