Accedere a un Jbutton "senza nome" in una classe anonima da un'altra classe anonima?
-
08-07-2019 - |
Domanda
Ho creato 26 JButton in un actionListener
anonimo etichettato come ogni lettera dell'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 + "");
}
Ora ho una classe keyListener
anonima, dove vorrei disabilitare il pulsante in base alla lettera che è stata premuta sulla tastiera. Quindi, se l'utente preme A, il pulsante A è disabilitato. È forse possibile vista la mia attuale implementazione?
Soluzione
Non potresti semplicemente dichiarare un array di 26 oggetti JButton a livello di classe, in modo che entrambi i listener possano accedervi? Credo che le classi interne anonime possano accedere alle variabili di classe e alle variabili finali.
Altri suggerimenti
Non so se si desidera disabilitare il pulsante o si desidera rimuoverlo? Nel tuo codice che stai chiamando rimuovi e nella tua risposta stai parlando di disabilitazione. È possibile ottenere ciò aggiungendo un KeyListener a alphabetPanel. Quindi potresti aggiungerlo subito prima di avviare il for-loop:
InputMap iMap = alphabetPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap aMap = alphabetPanel.getActionMap();
e invece di ActionListener aggiunto a JButton chiama questo:
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);
}
});
È anche possibile scorrere i componenti, confrontando getText () con il tasto premuto.
Come indicato da qualcun altro, le classi anonime possono anche accedere ai membri della classe esterna e alle finali locali