Почему ActionListener одного компонента влияет на другой? - PullRequest
0 голосов
/ 11 февраля 2012

В моей программе у меня есть несколько компонентов колебания, проблема, с которой я столкнулся, состояла в том, что мой метод ActionPerformed сработал бы дважды, если было инициировано событие действия. В конце концов я понял, что это произошло из-за того, что у моего verifyBtn (JButton) дважды был добавлен ActionListener к нему.

Однако есть одна вещь, которую я не понимаю, и я довольно новичок в Java, поэтому прости меня за то, что я спросил что-то, что может показаться очевидным:

Я дал всем своим слушателям действия компонентов вот так:

confirmBtn.addActionListener(this);

и затем ссылаться на них в моем ActionPerformed(ActionEvent e) методе, подобном этому:

if(e.getSource() == confirmBtn)
    Execute code....

У меня вопрос: почему тогда, случайно предоставив только одному компоненту дополнительный ActionListener, он затронул все другие компоненты, вызываемые в методе ActionPerformed, заставив их также запускаться дважды? это как-то связано с тем, как я дал каждому компоненту ActionListeners?

1 Ответ

0 голосов
/ 11 февраля 2012

Вы зарегистрировали одинаковые ActionListener для всех компонентов? this в вашем заявлении

confirmBtn.addActionListener(this);

заставляет меня так думать. Я не рекомендую это делать, так как вам нужно реализовать более сложную логику в методе actionPerformed(), и это может быстро запутаться.

Я бы создал отдельные ActionListener для каждого компонента, чтобы они работали независимо друг от друга. Это легко сделать, используя внутренние, локальные или анонимные классы . В качестве примера рассмотрим две кнопки: одну для подтверждения и одну для отмены. Моя предложенная структура будет:

public class MyFrame extends JFrame {
    ...
    public void mySetup() {
        ...
        confirmBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                 confirmed(e); // delegate to outer class for cleaner code
            }
        });

        canceledBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cancelled(e); // delegate to outer class for cleaner code
            }
        });
        ...
    }
    ...   
    private void confirmed(ActionEvent e) {
        // Your real confirmBtn action code 
    }

    private void cancelled(ActionEvent e) {
        // Your real cancelBtn action code
    }
    ...
}

Этот способ был бы более многословным, но, поскольку каждый компонент имеет свой собственный ActionListener, вероятность непреднамеренного взаимодействия намного меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...