Selezionare tutti i componenti di un array senza un ciclo
Domanda
Ho fatto una gamma completa di JLabels
e vorrei aggiungere un listener per loro.
L'ascoltatore non ha bisogno di sapere esattamente quale è stato fatto clic su, solo che era. C'è un modo per aggiungere l'ascoltatore a l'intera matrice invece di utilizzare un 'per) (' ciclo?
Grazie per la lettura.
Soluzione
Se le etichette vengono aggiunti un ad un contenitore (come un JPanel) è possibile aggiungere un ascoltatore a questo contenitore e sapere quale componente è in certa posizione.
JPanel panel = new JPanel();
panel.addMouseListener( whichOneListener );
f.setContentPane( panel );
In questo caso io uso un mouseListener perché mi danno la posizione in cui l'utente ha fatto clic.
private static MouseListener whichOneListener = new MouseAdapter() {
public void mouseClicked( MouseEvent e ) {
JComponent c = ( JComponent ) e.getSource();
JLabel l = ( JLabel ) c.getComponentAt( e.getPoint() );
System.out.println( l.getText() );
}
};
E stampe correttamente quale componente è stato cliccato.
Il codice sorgente completo è qui
Altri suggerimenti
Non v'è alcuna dalla soluzione di dialogo, per quanto ne so. Oltre ad utilizzare hack stupido, penso che si potrebbe essere necessario utilizzare un ciclo for, e può essere un codice di 10 linee, niente di cui preoccuparsi.
Si potrebbe avvolgere la matrice di JLabels in una classe e implementare il metodo proprio add () che registra l'ascoltatore su di aggiungerli.
In questo modo non avrebbe dovuto iterare su di loro in seguito ..
È possibile registrare il listener sul JPanel (o qualunque componente i pulsanti sono in) in modo da avere solo scrivere un singolo ascoltatore.
Se fosse un elenco di JLabels, io suggerirei utilizzando CollectionUtils.forAllDo -. metodo che consente di applicare stessa azione di un gruppo di oggetti