Apertura e chiusura JDialog

di il
13 risposte

Apertura e chiusura JDialog

Salve a tutti, ho un problema nel fare aprire e poi chiudere una JDialog. Mi spiego meglio.

Nella classe Main ho un pulsante che quando lo clicco mi apre un JDialog
 JDialog dialog = new JDialog (this,true);
 dialog.setVisible(true)
dopo dicchè, sempre nell'ActionLister del pulsante scrivo
System.out.println("Hello");
dialog.dispose();
ma sia apre la dialog e il programma non va avanti se la dialog non viene chiusa da me invece io vorrei che il programma andasse avanti e la chiuderebbe lui in automatico con il dispose().

Qualcuno mi può aiutare?

Grazie, ciao.

13 Risposte

  • Re: Apertura e chiusura JDialog

    cicciomaz ha scritto:


    e il programma non va avanti se la dialog non viene chiusa
    Perché la dialog l'hai fatta "modale" (quel true, new JDialog (this,true)
    Quando la dialog è modale, il dialog.setVisible(true) è BLOCCANTE, ovvero ritorna solo quando la dialog viene chiusa in un qualche altro modo. La esecuzione del setVisible quindi si blocca nel senso che non ritorna subito ma il "loop" degli eventi, continua grazie alla logica interna al setVisible.
    Quindi se è modale, ci deve essere un qualche evento gestito nella dialog che fa sì che venga chiusa.
  • Re: Apertura e chiusura JDialog

    Perchè se metto false la dialog si apre e si chiude in automatico solo che il contenuto non è visibile, è tutta bianca
  • Re: Apertura e chiusura JDialog

    cicciomaz ha scritto:


    Perchè se metto false la dialog si apre e si chiude in automatico solo che il contenuto non è visibile, è tutta bianca
    Se non è modale, il setVisible(true) NON è bloccante. Ma se nel tuo listener appena dopo fai un dialog.dispose(); ... ovviamente si chiude!
  • Re: Apertura e chiusura JDialog

    Si certo, in realtà deve fare delle operazioni più complesse che impiegano molto tempo e quindi vorrei creare una dialog che visualizzi caricamento in corso...
  • Re: Apertura e chiusura JDialog

    cicciomaz ha scritto:


    Si certo, in realtà deve fare delle operazioni più complesse che impiegano molto tempo e quindi vorrei creare una dialog che visualizzi caricamento in corso...
    Per una dialog "caricamento in corso" ok. Ma vuoi che la finestra che avevi resti "bloccata"? (avrebbe senso, così l'utente non interagisce facendo chissà cosa mentre fai quel "caricamento").

    Se vuoi che la finestra resti bloccata, allora è corretto che la dialog del "caricamento in corso" sia modale.
  • Re: Apertura e chiusura JDialog

    Si certo deve rimanere bloccata altrimenti se l'utente la chiude ma il caricamento non è finito non ha più senso
  • Re: Apertura e chiusura JDialog

    cicciomaz ha scritto:


    Si certo deve rimanere bloccata
    Allora È corretto che la dialog sia "modale".
  • Re: Apertura e chiusura JDialog

    Aspetta forse mi sono spiegato male. Deve rimanere bloccata la dialog ma la Main che l'ha lanciata deve ptoseguire il suo lavoro e appena lo termina la chiude
  • Re: Apertura e chiusura JDialog

    cicciomaz ha scritto:


    Aspetta forse mi sono spiegato male. Deve rimanere bloccata la dialog ma la Main che l'ha lanciata deve ptoseguire il suo lavoro e appena lo termina la chiude
    No, allora non hai ancora compreso bene lo scenario. Quando sei nel actionPerformed per il pulsante che lancia quel "caricamento", sei nel contesto del Event Dispatch Thread (come per qualunque altro evento della GUI). Il EDT NON lo si deve mai tenere "impegnato" per troppo tempo, altrimenti la interfaccia è congelata e non responsiva.
    Quindi di qualunque cosa si tratti quel "caricamento", se è particolarmente lungo NON lo puoi di certo fare nel contesto del EDT. Per forza DEVI farlo nel contesto di un thread di background a parte, con tutto quello che comporta (visibilità delle modifiche, sincronizzazione, ecc... che vanno compresi bene).
    Alla fine del thread di caricamento, farai passare un pezzetto di codice nel EDT (con il "solito" invokeLater) per chiudere la dialog "caricamento in corso". Il setVisible(true) della dialog "modale", quindi si sbloccherà e ritornerà, pertanto continuerai a fare quello che stavi facendo nel listener.

    Questo è lo scenario da applicare. Poi ci possono essere vari approcci e design. Da Java 6 non a caso è stata introdotta ufficialmente in Swing la classe SwingWorker che serve proprio per gestire un lavoro in un thread di "background" facilitando allo stesso tempo la interazione con la interfaccia utente, che va sempre fatta nel EDT.
  • Re: Apertura e chiusura JDialog

    Ok chiaro. Mi muoverò in questa direzione.
  • Re: Apertura e chiusura JDialog

    Hai perfettamente ragione. Sono andato a riprendere il Libro su Java 7 e sto vedendo di implementare la SwingWork che è la strada giusta. Solo un'ultima curiosità, quando sono nell'ActionLister potrei aprire un nuovo thread al quale potrei far svolgere il lavoro grosso. Secondo te potrebbe essere anch'essa una soluzione?
  • Re: Apertura e chiusura JDialog

    cicciomaz ha scritto:


    Hai perfettamente ragione. Sono andato a riprendere il Libro su Java 7 e sto vedendo di implementare la SwingWork che è la strada giusta. Solo un'ultima curiosità, quando sono nell'ActionLister potrei aprire un nuovo thread al quale potrei far svolgere il lavoro grosso. Secondo te potrebbe essere anch'essa una soluzione?
    Sì, puoi anche creare e gestire direttamente un tuo Thread. Chiaramente è meno facile rispetto all'uso di SwingWorker, perché spetta a te usare invokeLater nei punti e nel modo giusto per eseguire "qualcosa" nel EDT quando devi aggiornare la UI.

    Quindi se il "flusso" di lavoro dello SwingWorker ti va bene, usa pure questo. Altrimenti puoi usare direttamente un Thread (con quello che comporta). Se SwingWorker non fosse sufficiente e (per dire) nella tua applicazione avessi bisogno molte volte di un procedimento del genere (lancia un lavoro a parte, apri la dialog "caricamento ...", ecc...) puoi anche svilupparti un tuo Worker che faccia da "template" in modo che sia ri-usabile per lavori differenti.
  • Re: Apertura e chiusura JDialog

    Ok, chiaro.

    Gentilissimo. Grazie.
Devi accedere o registrarti per scrivere nel forum
13 risposte