Отключить кнопки в графическом интерфейсе в Swing

#java #swing #selenium-webdriver #jbutton

#java #swing #selenium-webdriver #jbutton

Вопрос:

У меня есть кнопки в графическом интерфейсе, которые выполняют тесты при нажатии в Selenium. Они могут запускаться только последовательно и в настоящее время добавляются EventQueue . Мне бы хотелось, чтобы при нажатии на кнопку и выполнении теста отключались другие кнопки, чтобы другие тесты не могли быть добавлены в очередь.

В настоящее время кнопка выглядит как:

     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 , поскольку это позволяет мне сбрасывать сообщения об ошибках обновления / сбоя в графическом интерфейсе.

Как я могу наилучшим образом добиться этого?

Комментарии:

1. В чем проблема с вашим кодом? Если вам не нужен отключенный эффект, т. Е. Если Было бы нормально, чтобы кнопка была интерактивной, но действие ничего не делало, вы могли бы использовать общий семафор (например, объект блокировки).

2. Вы никогда не должны использовать MouseListeners таким образом. Для этого и предназначены ActionListeners. Во-первых, MouseListeners игнорирует, если кнопка отключена, а ActionListeners — нет.

3. Помог ли вам мой ответ? Дайте мне несколько отзывов, чтобы я мог улучшить свой ответ.

4. Привет, в настоящее время я пытаюсь это реализовать, у меня есть около 15 кнопок в графическом интерфейсе, поэтому мне нужно будет установить для них значение по умолчанию ОТКЛЮЧЕНО?

Ответ №1:

Вы должны добавить ActionListener к своей кнопке. Что еще более важно, вы должны использовать соглашения об именах, что также означает, что имена ваших объектов должны начинаться с маленькой буквы. Заглавные буквы зарезервированы для классов и статических полей (все в верхнем регистре). Следующий код добавляет an 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);
            }
        }
    });

}