Pregunta

Me preguntaba si hay una manera de implementar un oyente de acción para un Jbutton sin nombre. Por ejemplo, tengo el siguiente bucle for que crea un botón para cada letra del alfabeto.

for (int i = 65; i < 91; i++){
     alphabetPanel.add(new JButton("<html><center>" + (char)i));
}

¿Hay alguna forma de agregar un escucha de acción para cada uno de esos botones sin deshacerme de mi bucle for y codificar cada JButton y luego crear un escucha de acción para cada uno?

Gracias de antemano,

Tomek

¿Fue útil?

Solución

Tu pregunta es un poco vaga. sería trivial modificar el ciclo para agregar un oyente dentro del ciclo:

ActionListener listener = something;

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i);
     button.addActionListener( listener );
     alphabetPanel.add(button);
}

si no puede modificar el bucle, puede iterar sobre todos los elementos secundarios del panel y agregar oyentes a cualquiera de los elementos secundarios que sean jbuttons.

también ¿por qué estás usando html para centrar el texto? no es esa exageración? ¿jbutton ya no centra el texto?
también puede usar setHorizontalAlignement (SwingConstants.CENTER) para hacerlo.

Otros consejos

¿Cuál es el problema de hacer esto?

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i));
     button.addActionListener( new ButtonListener());
     alphabetPanel.add(button);
}

...

class ButtonListener implements ActionListener {
     ButtonListener() {
     }
     public void actionPerformed(ActionEvent e) {
         //TODO:
     }
}

Además, si el texto del botón no identifica el botón, puede establecer el nombre del botón con la letra del alfabeto.

button.setName((char)i)); // or button.setName(i);

Por nombre, parece que quiere decir almacenar la instancia del botón en una variable local de su método inmediato. Es probable que intentar evitarlo haga que su código sea más difícil de leer. Pero para responder a su pregunta:

La forma más obvia es usar el viejo pero recientemente popular modismo de doble paréntesis.

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}});

Tenga en cuenta que, en este caso, como no es final, no se podrá utilizar desde la clase interna anónima. Asignelo a otra variable (final) o reformule el ciclo.

Otra ruta sería ir a través de una Acción. (Por lo general, sugiero evitar las acciones, ya que son simplemente Hashtable de un hombre pobre. ButtonModel es "bueno" aunque).

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
    public void actionPerformed(ActionEvent event) {
        ...
    }
}));

Luego, por supuesto, está la forma de biblioteca específica de la aplicación:

Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
    alphabetForm.button("<html><center>" + c, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}

Es posible agregar ActionListener a componentes anónimos como a continuación:

new JButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO your action             
            }           
        });

Sin embargo, en su caso en el que intenta agregar el JButton anónimo a su panel, este enfoque no funcionará porque se tomará el tipo de retorno del método addActionListener (que es nulo) en lugar del constructor de JButton como se muestra a continuación:

for (int i = 65; i < 91; i++){
             alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        // TODO your action             
                    }           
                }));
        }

El código anterior se queja de un argumento no válido para el método panel.add ().

Entonces, en su caso, tendrá que crear una instancia con nombre de JButton.

Espero que esto aclare.

Saludos cordiales, Suresh

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