Доступ к & # 8220; безымянному & # 8221; Jbutton в анонимном классе из другого анонимного класса?
-
08-07-2019 - |
Вопрос
Я создал 26 JButton в анонимном actionListener
, помеченном как каждая буква алфавита.
for (int i = 65; i < 91; i++){
final char c = (char)i;
final JButton button = new JButton("" + c);
alphabetPanel.add(button);
button.addActionListener(
new ActionListener () {
public void actionPerformed(ActionEvent e) {
letterGuessed( c );
alphabetPanel.remove(button);
}
});
// set the name of the button
button.setName(c + "");
}
Теперь у меня есть анонимный класс keyListener
, где я хотел бы отключить кнопку, в зависимости от того, какая буква была нажата на клавиатуре. Поэтому, если пользователь нажимает кнопку A, кнопка A отключается. Возможно ли это, учитывая мою текущую реализацию?
Решение
Не могли бы вы просто объявить массив из 26 объектов JButton на уровне класса, чтобы оба слушателя могли получить к ним доступ? Я считаю, что анонимные внутренние классы могут обращаться к переменным класса, а также к конечным переменным.
Другие советы
Я не знаю, хотите ли вы отключить кнопку или вы хотите удалить ее? В своем коде вы звоните удалить, а в своем ответе вы говорите об отключении. Вы могли бы достичь этого, добавив KeyListener в AlpinePanel. Таким образом, вы можете добавить это непосредственно перед запуском цикла for:
InputMap iMap = alphabetPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap aMap = alphabetPanel.getActionMap();
и вместо вашего ActionListener, добавленного в JButton, вызовите это:
iMap.put(KeyStroke.getKeyStroke(c), "remove"+c);
aMap.put("remove"+c, new AbstractAction(){
public void actionPerformed(ActionEvent e) {
// if you want to remove the button use the following two lines
alphabetPanel.remove(button);
alphabetPanel.revalidate();
// if you just want to disable the button use the following line
button.setEnabled(false);
}
});
Вы также можете перебирать компоненты, сравнивая getText () с нажатой клавишей.
Как уже упоминалось, анонимные классы могут также получать доступ к членам внешнего класса, а также к локальным финалам