Acceder a un & # 8220; sin nombre & # 8221; Jbutton en una clase anónima de otra clase anónima?

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

Pregunta

Creé 26 JButton en un actionListener anónimo etiquetado como cada letra del 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 + "");
} 

Ahora tengo una clase keyListener anónima, donde me gustaría desactivar el botón en función de qué letra se presionó en el teclado. Entonces, si el usuario presiona A, entonces el botón A está deshabilitado. ¿Es esto posible dada mi implementación actual?

¿Fue útil?

Solución

¿No podría simplemente declarar una matriz de 26 objetos JButton a nivel de clase, para que ambos oyentes puedan acceder a ellos? Creo que las clases internas anónimas pueden acceder a las variables de clase así como a las variables finales.

Otros consejos

No sé si desea desactivar el botón o si desea eliminarlo. En su código está llamando a eliminar y en su respuesta está hablando de deshabilitar. Puede lograr esto agregando un KeyListener al alphabetPanel. Entonces puede agregar esto justo antes de comenzar el ciclo for:

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

y en lugar de su ActionListener agregado al JButton, llame a esto:

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

También puede iterar a través de los componentes, comparando getText () con la tecla presionada.

Como alguien más mencionó, las clases anónimas también pueden acceder a los miembros de la clase externa, así como a las finales locales

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top