Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    1

    Più JButton che fanno cose analoghe

    Ciao, io ho un panel con più JButton che devono fare cose analoghe quando vengono cliccati. Più precisamente, quando viene schiacciato un bottone, il valore della sua JLabel dovrebbe venir scritta nel JTextField, che è unico per tutti i bottoni. Quindi ho creato un array di bottoni....insomma, tutto va bene fino la parte degli eventi. Ho provato ad associare l'evento click col ciclo (for) dove ad ogni iterazione del ciclo, ad un bottone dell'array viene associato il ActionListener e tutte le cose che servono per azionare l'evento. Ora il problema è che,si, mi associa un listener ad ogni bottone, però non mi manda il valore corrispondente della label nel textfield, ma mi manda in ArrayIndexOutOfBounds Exception, perchè vuole prendere il valore del elemento dell'array sul quale punta appena uscito dal for. Il codice sarebbe questo:

    private void defineActions(){

    for (k=0;k<j;k++){
    bLine[k].addActionListener(new ActionListener()
    {public void actionPerformed(ActionEvent event){
    request.setText(bLine[k].getText());
    }});
    }}
    bLine è l'array di JButton di "j" elementi
    request è il JTextField dove dovrebberò venir stampati i JLabel.

    Secondo me lo fa perchè mi crea 1 OGGETTO ActionListener e lo associa a tutti i bottoni.
    Penso che debba esistere un modo per non dover scrivere il codice analogo per ogni singolo bottone.

    Se qualcuno mi può aiutare, ne sarei molto grata.

  2. #2
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537

    Re: Più JButton che fanno cose analoghe

    Originariamente inviato da Mary_ry
    Secondo me lo fa perchè mi crea 1 OGGETTO ActionListener e lo associa a tutti i bottoni.
    Penso che debba esistere un modo per non dover scrivere il codice analogo per ogni singolo bottone.
    Non mi sembra....però attendo conferme!
    Tu crei per ogni bottone una nuova classe che ha un valore diverso per ogni tuo bLine[k].getText();.

    Inizia a provare a stampare a video k giusto per vedere se è come pensi.
    Se non mi è sfuggito nulla è giusto, ma se mi dici il contrario...

    Una possibile soluzione potrebbe quella di gestire tutti gli eventi con una classe che implements ActionListener.
    In questo modo ad ogni bottone ( o swing ) a cui vuoi aggiungere un comando devi fare:
    codice:
    swing.setActionCommand( "comando" );
    swing.addActionListener( ClasseActionListener );
    e ClasseActionListener deve contenere il metodo
    codice:
    public void actioPerformed( ActionEvent evento ){
          String eventoScatenato = evento.getActionCommand();
    ...
    ...
    }
    Trami il comando equals di String confronti eventoScatenato con i comandi impostati.
    La pecca di questo sistema è che se cambi il comado devi ricordarti di modificarlo anche nel suo gestore, mentre nell'altro modo no!
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  3. #3
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    Correzioni.
    Allora....
    Viene creata una sola classe come da te dedotto...ho fatto alcuni test ed è così, quindi mea culpa, ma quello che mi sorprende di più è:
    codice:
    for (k=0;k<j;k++){
       bLine[k].addActionListener(new ActionListener()
       {
             public void actionPerformed(ActionEvent event){
             request.setText(bLine[k].getText());
       }});
    }
    Mi spieghi come non ti fa a dar errore?
    Per la teoria dell'accessibilità in classi interne doveva iniziare a lampeggiarti tutto il pc in fase di compilazione, in quanto possono accedere variabili solo se dichiarate final.
    Ovvio è che se dichiari k come final poi non puoi fare k++ ( appunto perchè è final ).

    Detto ciò risolvi in questo modo:
    codice:
                   for ( int k=0; k<j; k++){
    			final int indexCommand = k;
    			bLine[k].addActionListener( new ActionListener() {
    				int test = indexCommand;
    				public void actionPerformed(ActionEvent event){
    				         request.setText( bLine[indexCommand].getText());
    			        }
                            });
    		}
    Per dubbi chiedi pure...
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Più JButton che fanno cose analoghe

    Originariamente inviato da Mary_ry
    codice:
    	for (k=0;k<j;k++){
    	      bLine[k].addActionListener(new ActionListener()
    				{public void actionPerformed(ActionEvent event){
    				request.setText(bLine[k].getText());
    					}});
    				}}
    No, non va bene (e non ha nemmeno senso!!!).
    La invocazione di actionPerformed avviene in un secondo momento, quando avviene l'evento. In quel frangente, quel 'k' non ti serve a nulla.

    L'evento ha una sorgente .... è il pulsante nel tuo caso! E ti basta ottenere il reference al componente.

    codice:
    bLine[k].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            JButton srcButton = (JButton) event.getSource();   // È il pulsante che ha originato l'evento
    
            request.setText(srcButton.getText());
        }
    });
    Semplice, no?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537

    Re: Re: Più JButton che fanno cose analoghe

    Originariamente inviato da andbin
    No, non va bene (e non ha nemmeno senso!!!).
    La invocazione di actionPerformed avviene in un secondo momento, quando avviene l'evento. In quel frangente, quel 'k' non ti serve a nulla.

    L'evento ha una sorgente .... è il pulsante nel tuo caso! E ti basta ottenere il reference al componente.

    codice:
    bLine[k].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            JButton srcButton = (JButton) event.getSource();   // È il pulsante che ha originato l'evento
    
            request.setText(srcButton.getText());
        }
    });
    Semplice, no?
    Ma sei troppo avanti...non ci avevo pensato!!! ( non è ironico, prima di qualche malinteso )
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.