Java реализует проблему ActionListener - PullRequest
3 голосов
/ 30 января 2011

По отношению к моей предыдущей проблеме у меня теперь есть новая проблема. Чтобы избежать внутреннего класса, мой класс теперь реализует actionListener. Мой код выглядит следующим образом:

public class MainGame extends JDialog implements ActionListener {

    public MainGame(JDialog owner) {
        super(owner, true);
        initComponents();
        jPanel1.setLayout(new GridLayout(3, 9, 3, 5));
        for (char buttonChar = 'a'; buttonChar <= 'z'; buttonChar++) {
            String buttonText = String.valueOf(buttonChar);
            letterButton = new JButton(buttonText);
            letterButton.addActionListener(this);
            jPanel1.add(letterButton);
        }

        newGame();
    }

    public void actionPerformed (ActionEvent action){
        if (action.getSource() == letterButton) {
            letterButton.setEnabled(false);
        }
    }

Как я могу воздействовать на слушателя моими кнопками от А до Я? Потому что все, что он может слушать, это последняя кнопка , которая в данном случае является кнопкой Z.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 30 января 2011

Вы слушатель можете слушать события со всех кнопок просто отлично.Ваша проблема в том, что вы, кажется, считаете, что вы можете манипулировать только полями классов.На самом деле, вам вообще не нужно поле letterButton для того, что вы пытаетесь сделать:

public void actionPerformed (ActionEvent action){
    ((JButton)action.getSource()).setEnabled(false);
}
2 голосов
/ 30 января 2011

На самом деле очень много кода отсутствует в том, что вы дали.Я подозреваю, что letterButton это поле в вашем классе.Поэтому вы снова и снова назначаете это поле в цикле for (через letterButton = new JButton(buttonText);).

Затем ActionListener сравнивает с вашим полем (которое к тому времени является последней кнопкой) и, следовательно, вызывается только кнопкой 'z '.

Возможное решение: используйте actionCommand на своих кнопках, чтобы определить, какая кнопка была нажата.

2 голосов
/ 30 января 2011

Ваш слушатель действия слушает все ваши кнопки.Однако вы проверяете только последнюю кнопку.

Вместо этого сделайте что-то вроде этого:

if(action.getSource() instanceof JButton){
    ((JButton)action.getSource()).setEnabled(false);
}
0 голосов
/ 30 января 2011

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

action.getSource() == letterButton

На самом деле, эта строка даже компилируется? Я был бы удивлен, если бы он сделал так, как вы пытаетесь присвоить значение вызову метода, который не имеет смысла.

лучше будет

letterButton == action.getSource();

Вы понимаете, почему?

изменить: игнорировать дерьмо выше. недостаточно сна или кофеина. Вздох ....

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

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