Aceder a um “sem nome” JButton em uma classe anônima de outra classe anônima?
-
08-07-2019 - |
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?
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