Io, quando ho a che fare con tanti pulsanti preferisco approcciare il problema in modo diverso:
creo una classe che estende JButton aggiungendo, generalmente, un campo (lo chiamo index) di tipo intero;
fatto questo utilizzo lo stesso Listener per tutti i pulsanti;
a questo punto, nel metodo actionPerformed() dell'ActionListener posso utilizzare un comodo switch() per distinguere i pulsanti.
Da notare che questo approccio mi snellisce di molto la stesura del codice nel caso dei Menu: generalmente quando si ha a che fare con i Menu si ha a che fare con un'ampia gamma di Listener (uno per ciascun Menu).
Esempietto pratico con i menu:
codice:
private class VoceMenu extends JMenuItem {
private int indice;
public VoceMenu(String nome, String immagine, int indice, ActionListener al) {
super(nome, immagine.equals("") ? null : new ImageIcon("immagini/" + immagine + ".gif"));
this.indice = indice;
addActionListener( al );
}
public int getIndice() { return indice; }
}
In questo caso, il costruttore del Menu richiede tutti i parametri (non è necessario, ovviamente): il nome visualizzato, l'eventuale immagine da visualizzare, l'indice che mi servirà poi per distinguere i menu e l'ActionListener da associargli.
Costruisco così i menu:
codice:
// Suppongo che la classe dove c'è il menu implementi ActionListener
JMenu mnuFile = new JMenu("File");
VoceMenu mnuFileNuovo = new VoceMenu("Nuovo", "", 0, this);
...
mnuFile.add( mnuFileNuovo );
...
add( mnuFile );
L'ActionListener ora è semplicissimo:
codice:
public void actionPerformed(ActionEvent ae) {
VoceMenu vm = (VoceMenu) ae.getSource();
switch ( vm.getIndice() ) {
case 0: // Il menu File->Nuovo
azioneFileNuovo(); // Richiamo il metodo che fa partire l'azione del menu File->Nuovo
break;
case 1: // Il menu File->Apri
...
}
}
Ciao.