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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top