Java permette anche di avere delle CLASSI ANONIME. Questo significa che puoi associare ad ogni pulsante un ActionListener dedicato anche senza conoscere a priori il numero di questi ActionListener.

Se devi, per esempio gestire k pulsanti puoi fare una cosa del genere: inserire questi k pulsanti in un array di k elementi e associare a ciascuno di questi un ActionListener:
codice:
for (int i=0; i<k; i++) {
   pulsante[k].addActionListener( new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
         gestisciPulsante(ae);
      }
   });
}
A questo punto, puoi estendere la classe Button (o JButton) e fare in modo che abbia un indice interno leggibile tramite un metodo. Così puoi usare il tanto amato switch:
codice:
public class MioBottone extends Button {
   private int indice;
   public MioBottone(int indice) { this.indice = indice; }
   public int getIndice() { return indice; }
   ...
}

public gestisciPulsante(ActionEvent ae) {
   MioBottone mb = ((MioBottone) ae.getSource());
   switch (mb.getIndice()) {
      case 0:  // primo pulsante (ma gli indici puoi sempre farli partire da 1)
         break;
      ...
   }
}
In questo modo dovrei aver risolto anche al tuo secondo problema (che era legatissimo al primo...).

Per il punto 3, a parte usare l'hashing come ti hanno già suggerito, non vedo altre soluzioni semplici.


Ciao.