Pergunta

Eu criei 26 JButton em uma actionListener anônima rotulado como cada letra do alfabeto.

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 + "");
} 

Agora eu tenho uma classe keyListener anônima, onde eu gostaria de desativar o botão baseado fora de qual letra foi pressionada no teclado. Portanto, se o usuário pressiona A, em seguida, o botão A está desativado. É este mesmo possível dada a minha implementação atual?

Foi útil?

Solução

Você não poderia simplesmente declarar uma matriz de 26 JButton objetos no nível de classe, de modo que ambos os ouvintes podem acessá-los? Acredito classes internas anônimas podem acessar variáveis ??de classe, bem como variáveis ??finais.

Outras dicas

Eu não sei se você quiser desativar o botão ou você quer removê-lo? Em você código que você está chamando de remoção e em sua resposta que você está falando sobre a desativação. Você poderia conseguir isso adicionando um KeyListener ao alphabetPanel. Então você pode adicionar esse pouco antes de iniciar o loop for:

InputMap iMap = alphabetPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap aMap = alphabetPanel.getActionMap();

e, em vez de sua ActionListener adicionado ao JButton chamar este:

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);
    }
});

Você também poderia percorrer os componentes, comparando getText () para a tecla pressionada.

Como alguém referiu, classes anônimas podem os membros também de acesso da classe externa, bem como finais locais

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top