ActionListener non funziona su serie di JButton inseriti con ciclo

di il
4 risposte

ActionListener non funziona su serie di JButton inseriti con ciclo

Ciao!
Ho inserito un serie di bottoni uguali che dovrebbero mostrare dei "dettagli" di una determinata informazione, quindi la situazione è questa: lista di informazioni ognuna con il suo pulsate "dettagli". Il problema è che l'ActionListener che inserisco sul pulsante che si ripete funziona solo sull'ultimo pulsante della lista. Qualcuno sa aiutarmi?
Intanto posto il codice, inserisco dei dati fittizi così che possiate testarlo se servisse.

public class provaDettagli
{
ActionListener dettagli;
JButton details;
JPanel panel = new JPanel();

public provaDettagli()
{
add(panel);

panel.setLayout(new GridBagLayout());
GridBagConstraints gcc = new GridBagConstraints();

JLabel titleDati = new JLabel("I TUOI DATI");
gcc.gridx = 0;
gcc.gridy = 0;
panel.add(titleDati, gcc);

JLabel titleDet = new JLabel("DETTAGLI");
gcc.gridx = 0;
gcc.gridy = 0;
titleDet.setVisible(false);
panel.add(titleDet, gcc);

int n = 1;
for(int i=0; i<3; i++)
{			
		JLabel info = new JLabel("informazione x");
		gcc.gridx = 0;
		gcc.gridy = n;
		gcc.anchor = GridBagConstraints.LINE_START;
		panel.add(info, gcc);
					
		details = new JButton("dettagli");
		gcc.gridx= 1;
		panel.add(details, gcc);
						
		n = n+1;
}

dettagli = new ActionListener()
{
	public void actionPerformed(ActionEvent e) 
	{
		Object source = e.getSource();
		if(source == details)
		{
			titleDati.setVisible(false);
			titleDet.setVisible(true);
		}
	}
};
details.addActionListener(dettagli);
}
}

4 Risposte

  • Re: ActionListener non funziona su serie di JButton inseriti con ciclo

    rossociliegia ha scritto:


    Il problema è che l'ActionListener che inserisco sul pulsante che si ripete funziona solo sull'ultimo pulsante della lista. Qualcuno sa aiutarmi?
    Perché la variabile details è una sola ovviamente e alla fine del ciclo ha il valore reference dell'ultimo JButton creato. E quindi la implementazione del ActionListener (che è una sola) usa quel details. E poi, ancora peggio, la registrazione del listener è sempre fatta su quel details che è appunto l'ultimo.
    Così non ha senso.

    Non ho visione completa di cosa vuoi fare, quindi è difficile capire cosa cambiare. Se hai 3 pulsanti creati in ciclo, cosa devono fare di diverso tra loro??
  • Re: ActionListener non funziona su serie di JButton inseriti con ciclo

    andbin ha scritto:


    Non ho visione completa di cosa vuoi fare, quindi è difficile capire cosa vuoi fare. Se hai 3 pulsanti creati in ciclo, cosa devono fare di diverso tra loro??
    In pratica il ciclo mostra una lista di "iscrizioni" presa dal database, quindi cliccando sul pulsante dovrei poter visualizzare i dettagli della determinata iscrizione. Come posso fare?
  • Re: ActionListener non funziona su serie di JButton inseriti con ciclo

    rossociliegia ha scritto:


    quindi cliccando sul pulsante dovrei poter visualizzare i dettagli della determinata iscrizione.
    E cosa è ciascun "dettaglio"? Tecnicamente parlando, che cosa/dove è come componente/i?
  • Re: ActionListener non funziona su serie di JButton inseriti con ciclo

    Senza maggiori dettagli io ti consiglierei un ciclo in cui aggiungi un diverso ActionListener per ogni pulsante, alla pressione del pulsante potresti aprire una finestrella modale con i dettagli (non userei come stai facendo tu i setVisible sui componenti come la label dei dettagli, non che non si possa fare ma ci vuole cautela), qualcosa di questo tipo, anche se molto abbozzato e con classi fittizie, tanto per mostrare lo schema:
    
    for (Iscrizione iscrizione : listaIscrizioni) {
        //...
        panel.add (new JButton (new AbstractAction ("Dettagli") {
            @Override public void actionPerformed (ActionEvent e) {
                new DetailsDialog (iscrizione.getDettagli ()).setVisible (true);
            }
        }));
        // ...
    }
    
    Ovviamente se non hai un layout che dispone in automatico i componenti in una qualche griglia, come il GridLayout, ma hai bisogno dell'indice, puoi sostituire il for-each con un normale ciclo for.
    Il punto principale è che con questa soluzione non hai alcun bisogno di tenere reference ai bottoni o agli ActionListener, crei tutto al volo, e ad ogni iterazione del ciclo avrai il tuo oggetto che rappresenta l'iscrizione, quindi puoi prenderne i dettagli o fare quello che vuoi: io appunto creerei una piccola dialog modale (DetailsDialog) che mostra i dettagli e può essere solo chiusa (come avviene per moltissimi programmi), poi ci sono diverse soluzioni ovviamente.
Devi accedere o registrarti per scrivere nel forum
4 risposte