2016-10-04 108 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); 
      } 
     } 
    }); 

}