Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110

    Finestra con bottone cambia colore sfondo

    Ciao,
    dovrei fare un programma CambiaColore che mi crei una finestra con all'interno un bottone. La finestra inizialmente ha sfondo rosso, se schiaccio il tasto dovrebbe passare a bianco e se lo schiaccio nuovamente, lo sfondo dovrebbe diventare nuovamente blu in loop.

    Non so dove sbaglio ma se premo il bottone non accade nulla pur non dandomi errori. Suppongo possa avere a che fare con l'actionEvent ma di base quando viene creata la finestra lo sfondo iniziale non è di colore rosso come io l'avevo impostato ma è bianca/grigia.

    Altra cosa: c'è un modo migliore (sicuramente si) per gestire l'actionEvent della premuta di un singolo tasto? Perché per il momento ho adattato un classico caso di scelta tra due bottoni...

    Grazie!

    Ecco il codice:
    codice:
    package interfacceutentegrafiche;
    
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    
    public class CambiaColore extends JFrame implements ActionListener {
    	public static final int LARGHEZZA = 300;
    	public static final int ALTEZZA = 200;
    	
    	public CambiaColore(){
    		
    		super();
    		setSize(LARGHEZZA, ALTEZZA);
    		
    		addWindowListener(new DistruttoreFinestra());
    		
    		setTitle("Finestra cambia colori");
    		
    		setLayout(new BorderLayout());
    		Container pannello = getContentPane();
    		pannello.setBackground(Color.RED);
    		
    		JButton pulsanteCambia = new JButton("Cambia!");
    		pulsanteCambia.addActionListener(this);
    		add(pulsanteCambia,"Center");
    	}
    
    
    	public void actionPerformed(ActionEvent e){
    		Container pannello = getContentPane();
    		if(e.getActionCommand().equals("Cambia!")){
    			if(pannello.getBackground().equals(Color.RED)){
    				pannello.setBackground(Color.WHITE);
    			} else if (pannello.getBackground() == Color.WHITE) {
    				pannello.setBackground(Color.BLUE);
    			} else   {
    				pannello.setBackground(Color.RED);
    			}
    		}
    	}
    	
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		CambiaColore finestracambia = new CambiaColore();
    		finestracambia.setVisible(true);
    	}
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Non so dove sbaglio ma se premo il bottone non accade nulla
    Ehm ... il tuo pulsante occupa TUTTO lo spazio del content pane ed ha un suo sfondo, bordo, ecc...
    Come pensi di poter vedere ciò che sta "sotto" il pulsante?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Ho cambiato da BorderLayout.Center a BorderLayout.North e ora funziona! non so come mai ma "Center" si prende tutta la finestra!

    Per quanto riguarda questo:

    Altra cosa: c'è un modo migliore (sicuramente si) per gestire l'actionEvent della premuta di un singolo tasto? Perché per il momento ho adattato un classico caso di scelta tra due bottoni...
    Hai qualche dritta? Grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    non so come mai ma "Center" si prende tutta la finestra!
    Ma ... è proprio così la logica di BorderLayout! La parte CENTER si prende tutto lo spazio del contenitore che ha BorderLayout, a meno dello spazio eventualmente occupato da un componente in NORTH e/o SOUTH e/o EAST e/o WEST.

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Per quanto riguarda questo:
    Altra cosa: c'è un modo migliore (sicuramente si) per gestire l'actionEvent della premuta di un singolo tasto? Perché per il momento ho adattato un classico caso di scelta tra due bottoni...

    Hai qualche dritta? Grazie
    Non ho ben capito cosa intendi ... alla possibilità di gestire più pulsanti? Alla possibilità di implementare più ActionListener?
    La questione è ampia, nel senso che puoi dare una implementazione specifica di ActionListener a ciascun pulsante, oppure ne puoi avere una unica (come nel tuo caso, dato che il ActionListener l'hai implementato a livello di classe principale del frame) e poi distinguere il pulsante che ha originato l'evento.

    Per distinguere il pulsante si può anche usare (specialmente per certi scenari particolari) il "action command". Ma in genere, ed è quello che faccio sovente anche io, è più semplice verificare per == di riferimento il "source" dell'evento:

    codice:
    private JButton button1;
    private JButton button2;
    
    .....
        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
    
            if (source == button1) {
                // .....
            } else if (source == button2) {
                // .....
            }
        }
    Se è stato button1 a generare l'evento, il "source" dell'evento è esattamente quello stesso oggetto JButton.
    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
    Registrato dal
    Aug 2016
    Messaggi
    110
    Ok, grazie.
    Ora una piccola variante... l'esercizio ora mi chiede di creare una finestra con tre pulsanti (start, stop, reset) come a simulare un cronometro. Allo schiacciare di un tasto cambia colore lo sfondo della finestra.Premesso che con container ho fatto nell'esempio suddetto, stavo cercando di prendere la mano con JPanel ma il risultato è che quando vado a schiacciare il tasto non accade nulla.
    Cosa sbaglio? Come faccio a rimuovere il pannelloGrande e a far visualizzare pannelloVerde quando schiaccio il tasto "Inizio"?
    Grazie

    Ecco il codice:

    codice:
    package interfacceutentegrafiche;
    
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class CronometroColorato extends JFrame implements ActionListener {
    
    
    	public static final int LARGHEZZA = 400;
    	public static final int ALTEZZA = 200;
    	
    	private JPanel pannelloRosso;
    	private JPanel pannelloVerde;
    	private JPanel pannelloArancione;
    	
    	public CronometroColorato(){
    		super();
    		
    		setSize(LARGHEZZA,ALTEZZA);
    		setTitle("Cronometro Colorato");
    		
    		JPanel pannelloGrande = new JPanel();
    		pannelloGrande.setLayout(new BorderLayout());
    				
    		pannelloVerde = new JPanel();
    		pannelloVerde.setBackground(Color.LIGHT_GRAY);
    		add(pannelloVerde);
    		
    		pannelloRosso = new JPanel();
    		pannelloRosso.setBackground(Color.LIGHT_GRAY);
    		add(pannelloRosso);
    		
    		pannelloArancione = new JPanel();
    		pannelloArancione.setBackground(Color.LIGHT_GRAY);
    		add(pannelloArancione);
    		
    		add(pannelloGrande,"Center");
    		
    		addWindowListener(new DistruttoreFinestra());
    		
    		JPanel pannelloPulsanti = new JPanel();
    		pannelloPulsanti.setBackground(Color.LIGHT_GRAY);
    		pannelloPulsanti.setLayout(new FlowLayout());
    		
    		JButton pulsanteStart = new JButton("Inizio");
    		pulsanteStart.setBackground(Color.LIGHT_GRAY);
    		pulsanteStart.addActionListener(this);
    		pannelloPulsanti.add(pulsanteStart);
    		
    		JButton pulsanteStop = new JButton("Stop");
    		pulsanteStop.setBackground(Color.LIGHT_GRAY);
    		pulsanteStop.addActionListener(this);
    		pannelloPulsanti.add(pulsanteStop);
    		
    		JButton pulsanteReset = new JButton("Reset");
    		pulsanteReset.setBackground(Color.LIGHT_GRAY);
    		pulsanteReset.addActionListener(this);
    		pannelloPulsanti.add(pulsanteReset);
    		add(pannelloPulsanti, "South");
    			
    	}
    	
    	public void actionPerformed(ActionEvent e){
    		//Container pannello = getContentPane();
    		
    		if(e.getActionCommand().equals("Inizio")){
    			pannelloVerde.setBackground(Color.GREEN);
    		}
    	}
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		CronometroColorato finestracronometro = new CronometroColorato();
    		finestracronometro.setVisible(true);
    	}
    	
    }

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.