Aggiornamento di una JTextField

di il
3 risposte

Aggiornamento di una JTextField

Salve a tutti del forum,
sto facendo una piccola applicazione demo (per imparare ad usare i JFrame di java).

Ci sono pulsanti, textfield, listbox (sempre swing).

Ho notato e poi ho avuto conferme che: Quando si genera un evento e richiamo il metodo associato a quell'evento (pulsante), finchè il metodo richiamato è in funzione, il frame è frizzato nel senso che non posso aggiornare nessun controllo (sopratutto una JTextField che mi fa da status dell'elaborazione) ma anche pulsanti e altro sono frizzati.

Ho paura che non mi sia chiaro qualcosa.

E' possibile che nel momento in cui il listener richiami il metodo make (presente nella classe), tutti gli oggetti grafici siano bloccati.

Ringrazio a chiunque mi dia una spiegazione di ciò.

Saluti e grazie per aver letto, ancor di più a chi risponde!!

3 Risposte

  • Re: Aggiornamento di una JTextField

    cnesan ha scritto:


    Ho notato e poi ho avuto conferme che: Quando si genera un evento e richiamo il metodo associato a quell'evento (pulsante), finchè il metodo richiamato è in funzione, il frame è frizzato nel senso che non posso aggiornare nessun controllo (sopratutto una JTextField che mi fa da status dell'elaborazione) ma anche pulsanti e altro sono frizzati.

    Ho paura che non mi sia chiaro qualcosa.
    Quando il framework invoca un metodo di un listener (actionPerformed, mouseClicked, keyPressed ecc...) lo fa nel contesto del Event Dispatch Thread, che è il solo e unico thread adibito alla gestione della interfaccia Swing e nel cui contesto è lecito accedere ai componenti della interfaccia.

    Quindi es. in un actionPerformed puoi tranquillamente fare tutti i getXyz, setXyz ecc... che vuoi sui componenti. Ma il risultato di qualunque modifica non lo vedi subito. Si vedrà solo dopo che il metodo del listener è terminato, dopo che il controllo è ritornato al framework, quando si accorgerà che ci sono aree da ridisegnare e andrà quindi a scatenare tutti i painting necessari sui componenti coinvolti.

    Una cosa del tipo:
    public void actionPerformed(ActionEvent e) {
        label1.setText("ciao");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) { ........ }
        label1.setText("prova");
    }
    Semplicemente è inappropriata.
    Il testo "ciao" non lo vedrai mai sul JLabel! Vedrai solo "prova" e oltretutto la cosa peggiore è che in quei 2 secondi hai "congelato" completamente la interfaccia che in quel frangente non è più responsiva (e non è bello).

    Se hai capito questo, hai capito il threading in Swing.
  • Re: Aggiornamento di una JTextField

    Ok,
    Ho risolto inserendo un timer e un timertask che si attiva all'inizio nel costruttore della classe.

    Il metodo associato al timertask controlla lo stato di una variabile booleana che gli indica se lanciare o meno il metodo (quello che facevo invocare prima dal listener).

    Al listener c'è solo un metodo che modifica la variabile booleana per dare il via all'altro metodo.

    Però, da un mio punto di vista, mi sembra un po strana la cosa.

    E' in questi casi che si parla di thread?

    Grazie per aver risposto.

    Saluti
  • Re: Aggiornamento di una JTextField

    cnesan ha scritto:


    Ho risolto inserendo un timer e un timertask che si attiva all'inizio nel costruttore della classe.

    Il metodo associato al timertask controlla lo stato di una variabile booleana che gli indica se lanciare o meno il metodo (quello che facevo invocare prima dal listener).

    Al listener c'è solo un metodo che modifica la variabile booleana per dare il via all'altro metodo.
    Innanzitutto, non sapendo il contesto di cosa vuoi fare, non saprei dirti se l'uso del java.util.Timer va bene oppure no. Ma da quanto dici, "a naso" non mi pare proprio la soluzione migliore .....

    Tieni però presente che il java.util.Timer esegue i task in un thread separato, che non è il Event Dispatch Thread. Quindi se il task legge una variabile che è scritta nel contesto del EDT, devi anche assicurare la "visibilità" delle modifiche, altrimenti non è affatto garantito che il task veda subito (e nemmeno se) il nuovo valore.
Devi accedere o registrarti per scrivere nel forum
3 risposte