Disabilitare un jbutton quando si scrive su una jtextfield

di il
24 risposte

Disabilitare un jbutton quando si scrive su una jtextfield

Ho una domanda, sapreste dirmi o comunque aiutarmi a capire come si fa per disabilitare un jbutton quando si sta per scrivere su una jtexfield?
ho provato un po :
if(tipo.getFocusTraversalKeysEnabled()==true){
			fine.setEnabled(false);
		}else{
			fine.setEnabled(true);
		}
il risultato che ho ottenuto è in parte realizzato nel senso che, il bottone fine è disabilitato(l'ho reso come trasparente ma non ci si può cliccare sopra) il problema è che rimane sempre trasparente.. in poche parole nel momento in cui è presente del testo nella textfield tipo, il jbutton fine deve essere disabilitato

24 Risposte

  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    palestrato ha scritto:


    Ho una domanda, sapreste dirmi o comunque aiutarmi a capire come si fa per disabilitare un jbutton quando si sta per scrivere su una jtexfield?
    Se ti va/basta di "giocare" sul focus, puoi registrare un FocusListener sul textfield. Al focusGained (ha ottenuto il focus) disabiliti il pulsante. Al focusLost (ha perso il focus), riabiliti il pulsante.


    P.S. getFocusTraversalKeysEnabled ti dice solo se per un certo componente i tasti particolari per il "focus traversal" (es. Tab / Shift+Tab) sono gestiti oppure no.
    Non vedo/capisco a cosa ti serva ....
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    andbin ha scritto:


    palestrato ha scritto:


    Ho una domanda, sapreste dirmi o comunque aiutarmi a capire come si fa per disabilitare un jbutton quando si sta per scrivere su una jtexfield?
    Se ti va/basta di "giocare" sul focus, puoi registrare un FocusListener sul textfield. Al focusGained (ha ottenuto il focus) disabiliti il pulsante. Al focusLost (ha perso il focus), riabiliti il pulsante.


    P.S. getFocusTraversalKeysEnabled ti dice solo se per un certo componente i tasti particolari per il "focus traversal" (es. Tab / Shift+Tab) sono gestiti oppure no.
    Non vedo/capisco a cosa ti serva ....
    No ma infatti non mi serve a niente.. pensavo fosse quello il metodo per il focus.. comunque, come si registra un nuovo focus?Lo devo registrare sulla textfield giusto? dopo che ho registrato il focus, devo fare dei controlli con il focusGained e focuslost?
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    palestrato ha scritto:


    come si registra un nuovo focus?Lo devo registrare sulla textfield giusto? dopo che ho registrato il focus, devo fare dei controlli con il focusGained e focuslost?
    FocusListener
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    Grazie !
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    Scusami ma come mai mi da errore quando inserisco this nella parentesi?
    JTextField tipo = new JTextField(2);
    		tipo.setAlignmentX(Component.CENTER_ALIGNMENT);
    		tipo.addFocusListener(this);
    		
    		JTextArea Display = new JTextArea (); 
    		Display.setEditable (false); 
    		Display.setRequestFocusEnabled (false); 
    	    Display.addFocusListener(this); 
    Poi sinceramente non è che sto capendo bene, sul link che mi hai dato non si capisce tutto..
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    palestrato ha scritto:


    Scusami ma come mai mi da errore quando inserisco this nella parentesi?
    La tua classe (riferita al this) implementa FocusListener?

    palestrato ha scritto:


    Poi sinceramente non è che sto capendo bene, sul link che mi hai dato non si capisce tutto..
    Il link era solo alla interfaccia, per farti vedere i metodi. Se sai implementare una interfaccia, sai implementare tutti i listener che vuoi.

    Credo che qualche "base" ti manchi .... ma è solo una mia impressione.
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    Ho implementato FocusListener e i due metodi focusGained e focusLost ma quando vado a fare:
    tipo.addFocusListener(this);
    Display.addFocusListener(this);
    
    mi dice errore comunque su this
    premetto che io implemento tutto questo con la gui nel main non nel costruttore..
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    Es.
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ProvaFrame extends JFrame {
        private JTextField textField1;
        private JTextField textField2;
        private JButton button;
    
        public ProvaFrame() {
            super("Prova");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(300, 200);
    
            textField1 = new JTextField(10);
            textField2 = new JTextField(10);
            button = new JButton("Pulsante");
    
            getContentPane().setLayout(new FlowLayout());
            getContentPane().add(textField1);
            getContentPane().add(textField2);
            getContentPane().add(button);
    
            textField1.addFocusListener(new FocusListener() {
                public void focusGained(FocusEvent e) {
                    button.setEnabled(false);
                }
    
                public void focusLost(FocusEvent e) {
                    button.setEnabled(true);
                }
            });
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new ProvaFrame().setVisible(true);
                }
            });
        }
    }
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    Va bene ma nel caso in cui io non avessi un costruttore ma implemento tutto in un main? In poche parole ho una classe senza attributi con un solo metodo main dove implemento la grafica:
    public class Bar implements FocusListener{
    
    	public static void main(String[] args) {
    		ListaConsumazioni lista = new ListaConsumazioni();
    		Vector<Consumazione> vconsumazioni = new Vector<Consumazione>();
    		
    		JFrame f = new JFrame("Gestione consumazioni/Programma realizzato da Tommaso Perilli");
    		JPanel p = new JPanel();
    		
    		JButton registra = new JButton("Registra");
    		registra.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		JLabel ltipoconsumazione = new JLabel("Tipo Consumazione");
    		ltipoconsumazione.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		JTextField tipo = new JTextField(2);
    		tipo.setAlignmentX(Component.CENTER_ALIGNMENT);
    		//tipo.addFocusListener();
    		
    
    		
    		JLabel lprezzo = new JLabel("Prezzo consumazione");
    		lprezzo.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		JTextField prezzo = new JTextField(2);
    		prezzo.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		JTextArea a = new JTextArea(10,5);//qui verrà visualizzato lo scontrino
    		JTextArea b = new JTextArea(10,5);//qui verranno visualizzati tutte le consumazioni
    		JScrollPane scroll=new JScrollPane(b);//aggiunge lo scroll al campo di testo
    		JScrollPane scroll2 = new JScrollPane(a);
    		a.setEditable(false);
    		b.setEditable(false);
    		scroll.setAutoscrolls(true);
    		scroll2.setAutoscrolls(true);
    		
    		JButton fine = new JButton("Fine consumazione");
    		fine.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		
    		JLabel ltotale = new JLabel("Incasso totale:");
    		JTextArea c = new JTextArea(1,4);
    		c.setEditable(false);
    		
    		//sul jpanel p verrà implementato uno stile
    		p.setLayout(new FlowLayout());
    		p.add(new JLabel("Gestione Bar"));
    		
    		JPanel p2 = new JPanel();
    		p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));
    		p2.add(ltipoconsumazione);
    		p2.add(tipo);
    		p2.add(lprezzo);
    		p2.add(prezzo);
    		p2.add(registra);
    		p2.add(fine);
    		
    		JPanel p3 = new JPanel();
    		p3.setLayout(new BoxLayout(p3, BoxLayout.Y_AXIS));
    		p3.add(new JLabel("Scontrino fiscale precedente:"));
    		p3.add(scroll2);
    		
    		JPanel p4 = new JPanel();
    		p4.setLayout(new BoxLayout(p4, BoxLayout.Y_AXIS));
    		p4.add(new JLabel("Lista consumazioni totali"));
    		p4.add(scroll);
    		
    		JPanel p5 = new JPanel();
    		p5.setLayout(new FlowLayout());
    		p5.add(ltotale);
    		p5.add(c);
    		
    		registra.addActionListener(new GestorePulsante(a,b,tipo,prezzo,c,lista,vconsumazioni));
    		fine.addActionListener(new GestorePulsante(a,b,tipo,prezzo,c,lista,vconsumazioni));
    		
    		f.addWindowListener(new GestoreFinestra(f));
    		
    		f.getContentPane().add(p,BorderLayout.NORTH);
    		f.getContentPane().add(p2,BorderLayout.WEST);
    		f.getContentPane().add(p3,BorderLayout.CENTER);
    		f.getContentPane().add(p4,BorderLayout.EAST);
    		f.getContentPane().add(p5,BorderLayout.SOUTH);
    		
    		f.setSize(700,300);
    		f.setLocation(400,300);
    		f.pack();
    		f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		f.setVisible(true);
    		
    	}
    
    	@Override
    	public void focusGained(FocusEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void focusLost(FocusEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	
    
    
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    palestrato ha scritto:


    non avessi un costruttore ma implemento tutto in un main?
    No, non dovresti!
    E adesso che vedo il tuo codice completo, ovviamente è chiaro: sei in un metodo static, il this NON esiste. Siccome FocusListener è a livello della classe, vuol dire che dovresti creare una istanza della tua classe Bar e passarla al addFocusListener.
    Ma comunque non è una buona soluzione.

    Prendi spunto dal mio esempio e usa anche il "solito" invokeLater nel main per far partire tutta la creazione della GUI nel contesto del Event Dispatch Thread.
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    E' la stessa cosa se creo una classe finestra dove implemento la GUI con il focus nel costruttore e poi istanzio la classe finestra nella classe bar?
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    palestrato ha scritto:


    E' la stessa cosa se creo una classe finestra dove implemento la GUI con il focus nel costruttore e poi istanzio la classe finestra nella classe bar?
    Se intendi dire: avere una classe con solo il main() (come è nel mio esempio di prima) e poi una classe separata per il frame (che estende JFrame), sì va bene ed è assolutamente appropriato.
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    Okay grazie ho risolto così:
    public class FinestraPrincipale extends JFrame implements FocusListener{
    	
    	public FinestraPrincipale(){
    		ListaConsumazioni lista = new ListaConsumazioni();
    		Vector<Consumazione> vconsumazioni = new Vector<Consumazione>();
    		
    		JFrame f = new JFrame("Gestione consumazioni/Programma realizzato da Tommaso Perilli");
    		JPanel p = new JPanel();
    		
    		JButton registra = new JButton("Registra");
    		registra.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		JLabel ltipoconsumazione = new JLabel("Tipo Consumazione");
    		ltipoconsumazione.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		final JButton fine = new JButton("Fine consumazione");
    		fine.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		JTextField tipo = new JTextField(2);
    		tipo.setAlignmentX(Component.CENTER_ALIGNMENT);
    		tipo.addFocusListener(new FocusListener(){
    			public void focusGained(FocusEvent e) {
                fine.setEnabled(false);
    			}
    
    			public void focusLost(FocusEvent e) {
                fine.setEnabled(true);
    			}
            });
    		
    		JLabel lprezzo = new JLabel("Prezzo consumazione");
    		lprezzo.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		JTextField prezzo = new JTextField(2);
    		prezzo.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		prezzo.addFocusListener(new FocusListener(){
    			public void focusGained(FocusEvent e) {
    	            fine.setEnabled(false);
    	        }
    
    	        public void focusLost(FocusEvent e) {
    	            fine.setEnabled(true);
    	        }
    		});
    		
    		JTextArea a = new JTextArea(10,5);//qui verrà visualizzato lo scontrino
    		JTextArea b = new JTextArea(10,5);//qui verranno visualizzati tutte le consumazioni
    		JScrollPane scroll=new JScrollPane(b);//aggiunge lo scroll al campo di testo
    		JScrollPane scroll2 = new JScrollPane(a);
    		a.setEditable(false);
    		b.setEditable(false);
    		scroll.setAutoscrolls(true);
    		scroll2.setAutoscrolls(true);
    		
    		
    		JLabel ltotale = new JLabel("Incasso totale:");
    		JTextArea c = new JTextArea(1,4);
    		c.setEditable(false);
    		
    		//sul jpanel p verrà implementato uno stile
    		p.setLayout(new FlowLayout());
    		p.add(new JLabel("Gestione Bar"));
    		
    		JPanel p2 = new JPanel();
    		p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));
    		p2.add(ltipoconsumazione);
    		p2.add(tipo);
    		p2.add(lprezzo);
    		p2.add(prezzo);
    		p2.add(registra);
    		p2.add(fine);
    		
    		JPanel p3 = new JPanel();
    		p3.setLayout(new BoxLayout(p3, BoxLayout.Y_AXIS));
    		p3.add(new JLabel("Scontrino fiscale precedente:"));
    		p3.add(scroll2);
    		
    		JPanel p4 = new JPanel();
    		p4.setLayout(new BoxLayout(p4, BoxLayout.Y_AXIS));
    		p4.add(new JLabel("Lista consumazioni totali"));
    		p4.add(scroll);
    		
    		JPanel p5 = new JPanel();
    		p5.setLayout(new FlowLayout());
    		p5.add(ltotale);
    		p5.add(c);
    		
    		registra.addActionListener(new GestorePulsante(a,b,tipo,prezzo,c,lista,vconsumazioni));
    		fine.addActionListener(new GestorePulsante(a,b,tipo,prezzo,c,lista,vconsumazioni));
    		
    		f.addWindowListener(new GestoreFinestra(f));
    		
    		f.getContentPane().add(p,BorderLayout.NORTH);
    		f.getContentPane().add(p2,BorderLayout.WEST);
    		f.getContentPane().add(p3,BorderLayout.CENTER);
    		f.getContentPane().add(p4,BorderLayout.EAST);
    		f.getContentPane().add(p5,BorderLayout.SOUTH);
    		
    		f.setSize(700,300);
    		f.setLocation(400,300);
    		f.pack();
    		f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		f.setVisible(true);
    	}
    
    	@Override
    	public void focusGained(FocusEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void focusLost(FocusEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    }
    
    e:
    public class Bar{
    
    	public static void main(String[] args) {
    		SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new FinestraPrincipale();
                }
            });
    		
    	}
    
    }
    	
    Grazie mille! sei un grande
    Un'ultima cosa, come faccio a disabilitare un bottone quando un campo di testo è vuoto? perchè adesso ho disabilitato un bottone quando si clicca sopra ad una jtextfield insomma..
  • Re: Disabilitare un jbutton quando si scrive su una jtextfield

    palestrato ha scritto:


    okay grazie ho risolto così:
    Strutturalmente è assolutamente corretto e appropriato.
    Non ho verificato in dettaglio il codice, comunque. L'unica cosa che mi salta subito all'occhio è che hai implementato FocusListener a livello di classe ma poi stai usando dei FocusListener implementati come ho fatto nel mio esempio. Sono due cose differenti.

    Io personalmente tendo a "nascondere" le implementazioni dei listener, usando delle inner class private ("regular" o "anonymous"). Generalmente è preferibile.

    palestrato ha scritto:


    come faccio a disabilitare un bottone quando un campo di testo è vuoto? perchè adesso ho disabilitato un bottone quando si clicca sopra ad una jtextfield insomma..
    Dovresti registrare un DocumentListener sul Document del componente di testo (JTextField o JTextArea che sia).
    A fronte di qualunque modifica (change/insert/remove), se il campo è vuoto fai X altrimenti Y.


    P.S. visto meglio ora: la tua FinestraPrincipale è già un JFrame .... perché fai un new JFrame? NON serve. Rivedi il mio esempio.
Devi accedere o registrarti per scrivere nel forum
24 risposte