Доступ к & # 8220; безымянному & # 8221; Jbutton в анонимном классе из другого анонимного класса?

StackOverflow https://stackoverflow.com/questions/286651

Вопрос

Я создал 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 () с нажатой клавишей.

Как уже упоминалось, анонимные классы могут также получать доступ к членам внешнего класса, а также к локальным финалам

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top