Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132

    [JAVA] abilitare disabilitare un JButton

    Ciao a tutti ho creato l'interfaccia grafica del mio tool...

    Mi mancano solo piccoli accorgimenti....

    Per esempio sul click di un bottone:

    codice:
    	public void actionPerformed(ActionEvent e) {
    		
    		if("dlFile".equals(e.getActionCommand())){
    			Downloader dl = new Downloader();
    			dl.download();
    			
    		}
                 }
    siccome il dl.download è un metodo che scarica diversi file (circa 200) ci mette un bel po' di tempo dovrei rendere non cliccabile il bottone finchè il metodo dl.download() non ha terminato..

    So che esistono i metodi setEnable() sui JButton ma come faccio a capire quando download() ha terminato?

    Come posso fare??

    Grazie.

    mainetz.

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

    Re: [JAVA] abilitare disabilitare un JButton

    Originariamente inviato da mainetz
    codice:
    	public void actionPerformed(ActionEvent e) {
    		
    		if("dlFile".equals(e.getActionCommand())){
    			Downloader dl = new Downloader();
    			dl.download();
    			
    		}
                 }
    siccome il dl.download è un metodo che scarica diversi file (circa 200) ci mette un bel po' di tempo dovrei rendere non cliccabile il bottone finchè il metodo dl.download() non ha terminato..
    Quindi quel metodo download() è "bloccante" cioè blocca l'esecuzione del metodo actionPerformed() per tutto il tempo del download???

    Se è così, è altamente sbagliato!!! actionPerformed (e in generale i metodi di tutti gli altri listener AWT/Swing) vengono chiamati nel contesto del EDT, event-dispatch-thread. È il thread della interfaccia utente e non va mai bloccato per troppo tempo!!!!
    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 L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    no appunto non è bloccante, nel senso che è possibile cliccare sugli altri bottoni (e anche sullo stesso).

    Quasi quasi forse è meglio che apra una nuova finestra con una barra che carica piuttosto che un icona rossa che diventa verde quando il metodo dl ha finito... ma come posso farla questa sincronizzazione?

    grazie mille per il vostro supporto!

    saluti

    mainetz.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Se non è bloccante, allora prima della chiamata al metodo download(), disabilita il pulsante: metodo setEnabled(), come da documentazione, che va sempre tenuta sottomano.

    Quando il metodo ha finito (lo sai tu quando finisce il suo lavoro) lo riabiliti. Potrebbe essere necessario passare al metodo un riferimento al pulsante da riabilitare.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132

    Re: Re: [JAVA] abilitare disabilitare un JButton

    Originariamente inviato da andbin
    Quindi quel metodo download() è "bloccante" cioè blocca l'esecuzione del metodo actionPerformed() per tutto il tempo del download???

    Se è così, è altamente sbagliato!!! actionPerformed (e in generale i metodi di tutti gli altri listener AWT/Swing) vengono chiamati nel contesto del EDT, event-dispatch-thread. È il thread della interfaccia utente e non va mai bloccato per troppo tempo!!!!

    ops ho detto una cavolata...

    Quel metodo è si bloccante....

    Mi sa che ho fatto una stupidata e adesso non so come risolverla....

    saluti.

    mainetz.

  6. #6
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Ho risolto faccio eseguire il codice che eseguiva ActionPerformed ad un thread e in ActionPerformed faccio solo chiamare il thread... Insomma così:

    codice:
    	public void actionPerformed(ActionEvent e) {
    		
    		if("dlFile".equals(e.getActionCommand())){
    			Thread t1 = new Thread(new PushButtonDownload(a1));	
    			t1.start();
                 }
    e il mio thread è:

    codice:
    public class PushButtonDownload implements Runnable {
    	
    	protected JButton a1;
    	
    	public PushButtonDownload(JButton bottone){
    		
    		a1 = bottone;
    		a1.setEnabled(false);
    				
    	}
    	
    	public void run(){
    		
    		Downloader dl = new Downloader();
    		dl.download();
    		a1.setEnabled(true);
    		
    	}
    
    }
    In questo modo l'interfaccia grafica non attende la fine di dl.download() il pulsante appena viene premuto non si riabilita finchè dl.download() non ha terminato e ho risolto (credo) il mio problema!!

    Grazie mille a tutti voi!!!

    Ciao!

    mainetz!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mainetz
    codice:
    a1.setEnabled(true);
    Dovresti farlo nel contesto del EDT, non nel contesto del tuo thread. Se un metodo di un componente Swing non è esplicitamente descritto come thread-safe (e ci sono diversi casi), bisognerebbe evitarne l'uso da altri thread che non siano il EDT.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.