Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [JButton] Cambio icona al click

    Salve, ho una situazione di questo tipo:
    codice:
    public class frameSalaPosti extends JFrame{    
        private JPanel pSala,p,pPosti;
        private JButton bPosto;
    
        ImageIcon libero=new ImageIcon("libero2.png");
            ImageIcon occupato=new ImageIcon("occupato2.png");
            ImageIcon selezionato=new ImageIcon("selezionato2.png");
     
    public frameSalaPosti(){
         setJPanelSPosti();
    }
    
    class Seleziona implements ActionListener{
            private char f;
            private int p;
            public Seleziona(char f,int p){
                this.f=f;
                this.p=p;
            }
            public void actionPerformed(ActionEvent e){
                for(int j=f;j<=f+1;j++)
                    for(int i=p;i<=p+1;i++)
                        bPosto.setIcon(selezionato);
                jta.append(" \t"+f+""+p+"\n");
            }
        }
    
    
    private void setJPanelSPosti(){
            pSala=new JPanel();
            p=new JPanel();
    
                    int file=10;
                    int posti=10;
     
                pSala.setLayout(new BorderLayout());
            p.setLayout(new GridLayout(file,posti));
            
            for(char i='A';i<65+file;i++){
                for(int j=1;j<=posti;j++){
                    pPosti=new JPanel();
                    bPosto=new JButton(libero);
                    pPosti.add(bPosto);
                    p.add(pPosti);
                    ActionListener listSelezione=new Seleziona(i,j);
                    bPosto.addActionListener(listSelezione);
                }
            }
            pSala.add(p,BorderLayout.CENTER);
            add(pSala);
        }
    }
    come posso far cambiare icona al pulsante cliccato da libero a selezionato e da selezionato a occupato con un secondo click?
    Utilizzando questo codice qualsiasi bottone clicco mi cambia l'icona dell'ultimo tasto, come posso fare?
    Ultima modifica di stefanaimon; 17-12-2014 a 22:57

  2. #2
    Credo che il metodo più immediato siaquello di fare un check. Prima di cambiare controlla quale immagine è caricato nel pulsante, a seconda di ciò che è caricato cambi l'immagine.
    ciao

  3. #3
    Quote Originariamente inviata da gigiachiara Visualizza il messaggio
    Credo che il metodo più immediato siaquello di fare un check. Prima di cambiare controlla quale immagine è caricato nel pulsante, a seconda di ciò che è caricato cambi l'immagine.
    ciao
    L'idea potrebbe essere giusta, e come tu mi hai suggerito ho apportato una modifica, ma il problema non viene risolto perchè l'ActionListener lo fa valere solo per l'ultimo bottone. Altre idee?

    MODIFICA:
    codice:
    ....
    class Seleziona implements ActionListener{
    		private char f;
    		private int p;
    		private Icon disp;
    		public Seleziona(char f,int p,Icon disp){
    			this.f=f;
    			this.p=p;
    			this.disp=disp;
    		}
    		public void actionPerformed(ActionEvent e){
    					if(disp==libero)
    						bPosto.setIcon(selezionato);
    					if(disp==selezionato)
    						bPosto.setIcon(occupato);
    		}
    ...
    
    	for(char i='A';i<65+file;i++){
    			for(int j=1;j<=posti;j++){
    				pPosti=new JPanel();
    				bPosto=new JButton(libero);
    				pPosti.add(bPosto);
    				p.add(pPosti);
    				ActionListener listSelezione=new Seleziona(i,j,bPosto.getIcon());
    				bPosto.addActionListener(listSelezione);
    			}
    		}

  4. #4
    Il problema sta nel fatto che tu ad ogni ciclo del for crei un nuovo jbutton e lo assegni a bposto quindi alla fine essa conterrà l'ultimo bottone creato, per risolvere hai diversi modi, recuperi il bottone dalla lista, recuperi il bottone dal actionevent (getSource ti restituisce un object quindi devi fare un cast a jbutton) oppure la soluzione secondo me migliore cioè passi al tuo listener anche il bottone su cui agire

  5. #5
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    la soluzione secondo me migliore cioè passi al tuo listener anche il bottone su cui agire
    In che senso? Nel costruttore del listener mi chiamo il JButton e fin qui non è un problema, e poi il ciclo forma come lo modifico?
    codice:
    for(int i='A';i<=65+file;i++)
       for(int j=1;j<=posti;j++)
          JPanel posto=new JPanel();
           ActionListener(i,j,bPosto.getIcon();new JButton(libero);
    ....

  6. #6
    In che senso? Nel costruttore del listener mi chiamo il JButton e fin qui non è un problema
    Nel costruttore del listener tu non chiami nessuno JButton ma ti arriva l'iconea associato al JButton
    L'errore sta in questo punto
    codice:
     for(int j=1;j<=posti;j++){
                    ....
                    bPosto=new JButton(libero);
                    ....
                }
    Cioè bPosto conterrà l'ultimo jbutton che crei, quindi quando poi verrà scatenato il listener e tu invochi "bPosto.setIcon" lo invochi appunto sull'ultimo bottone creato.
    Ovviamente il bottone lo puoi passare al costruttore del listener:
    codice:
    class Seleziona implements ActionListener{
            private char f;
            private int p;
            private Icon disp;
            private JButton button;
            public Seleziona(char f,int p,JButton button,Icon disp){
                this.f=f;
                this.p=p;
                this.disp=disp;
                this.button = button;
            }
            public void actionPerformed(ActionEvent e){
                        if(disp==libero)
                            button.setIcon(selezionato);
                        if(disp==selezionato)
                            button.setIcon(occupato);
            }
    }
    		//PASSAGGIO DEL VALORE NEL FORM
    		 ActionListener listSelezione=new Seleziona(i,j,bPosto,bPosto.getIcon());
    Inoltre volendo a questo punto potresti anche omettere di passare l'iconea che cmq ti potresti recuperare dal button passato.

  7. #7
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    Nel costruttore del listener tu non chiami nessuno JButton ma ti arriva l'iconea associato al JButton
    L'errore sta in questo punto
    codice:
     for(int j=1;j<=posti;j++){
                    ....
                    bPosto=new JButton(libero);
                    ....
                }
    Cioè bPosto conterrà l'ultimo jbutton che crei, quindi quando poi verrà scatenato il listener e tu invochi "bPosto.setIcon" lo invochi appunto sull'ultimo bottone creato.
    Ovviamente il bottone lo puoi passare al costruttore del listener:
    codice:
    class Seleziona implements ActionListener{
            private char f;
            private int p;
            private Icon disp;
            private JButton button;
            public Seleziona(char f,int p,JButton button,Icon disp){
                this.f=f;
                this.p=p;
                this.disp=disp;
                this.button = button;
            }
            public void actionPerformed(ActionEvent e){
                        if(disp==libero)
                            button.setIcon(selezionato);
                        if(disp==selezionato)
                            button.setIcon(occupato);
            }
    }
            //PASSAGGIO DEL VALORE NEL FORM
             ActionListener listSelezione=new Seleziona(i,j,bPosto,bPosto.getIcon());
    Inoltre volendo a questo punto potresti anche omettere di passare l'iconea che cmq ti potresti recuperare dal button passato.
    grazie mille francesco!

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.