Mostrare una form temporanea

di il
2 risposte

Mostrare una form temporanea

Buongiorno,
avrei bisogno una mano su una questione che mi sembra semplice ma non mi funziona. 

Situazione:
Ho un programma che parte ed esegue i metodi presenti nel costruttore della JFrame.
Schematizzando:
private void A
private void B
private void C

Vorrei che mentre viene eseguito il metodo B comparisse una finestra con un messaggio che poi faccio sparire non appena la JFrame è apparsa, ovvero è stato concluso anche il metodo C.

Quindi ho creato una semplice finestra MostraMessaggioFrm con una JLabel, nella quale vado a inserire un testo che ricevo come argomento del costruttore.

Chiamo la finestra MostraMessaggioFrm nel metodo A e mi compare, ma il testo della JLabel non si vede.
Poi alla fine di C eseguo MostraMessaggioFrm.setVisible(false); e quindi giustamente sparisce.

Ho provato a posizionare il caricamento del testo nella JLabel sia in un metodo chiamato nel costruttore che direttamente nel costruttore, ma continua a non comparire.

Come dovrei fare per far comparire il testo nella JLabel?

2 Risposte

  • Re: Mostrare una form temporanea

    17/10/2024 - ZioCrick ha scritto:


    Vorrei che mentre viene eseguito il metodo B comparisse una finestra con un messaggio che poi faccio sparire non appena la JFrame è apparsa, ovvero è stato concluso anche il metodo C.

    Ho provato a posizionare il caricamento del testo nella JLabel sia in un metodo chiamato nel costruttore che direttamente nel costruttore, ma continua a non comparire.

    La questione è sempre la “solita” in Swing: c'è un solo ed unico thread, il Event Dispatch Thread, in cui vengono dispacciati gli eventi e (ri)disegnati i componenti Swing. Se quel costruttore lo hai invocato a seguito di un evento (es. ActionEvent ma vale per qualunque altro), allora sei già nel EDT e fintanto che lo stai tenendo occupato tu, nulla può essere dispacciato/ridisegnato. Il tuo codice deve finire, si deve tornare indietro a ritroso delle chiamate e il controllo ritornare al framework Swing, che quindi potrà poi fare altro.

    Ma il punto è che dici che il messaggio deve comparire il B e poi sparire poco dopo la fine di C. Allora si tratta di una operazione “lunga”, altrimenti il messaggio non avrebbe (forse) senso. Lunga quanto? Secondi? Minuti? Allora la questione sarebbe diversa: devi eseguire un lavoro “lungo” in background, ovvero con un thread separato in modo da lasciare “libero” il EDT. E naturalmente non va fatto banalmente in un costruttore.

  • Re: Mostrare una form temporanea

    17/10/2024 - andbin ha scritto:


    Ma il punto è che dici che il messaggio deve comparire il B e poi sparire poco dopo la fine di C. Allora si tratta di una operazione “lunga”, altrimenti il messaggio non avrebbe (forse) senso. Lunga quanto? Secondi? Minuti? Allora la questione sarebbe diversa: devi eseguire un lavoro “lungo” in background, ovvero con un thread separato in modo da lasciare “libero” il EDT. E naturalmente non va fatto banalmente in un costruttore.

    Capisco. Di fatto l'operazione tra B e C dura una manciata di secondi.
    In pratica ho delle applicazioni che accedono ad un db MySQL che prevede di avere il server MySQL attivo.
    Allora siccome ero solito lanciare il server MyMQL a mano prima di eseguire la prima volta queste applicazioni, e siccome ho realizzato anche un'applicazione che lancia altri programmi, che se ricordi, mi hai aiutato parecchio a realizzare, dandomi proprio delle dritte sulla gestione di vari thread, mi è venuta l'idea di gestire il lancio del server MySQL dall'interno dell'applicazione, nel caso l'apertura del db vada in errore.

    Il tutto funziona e in effetti potrei fare a meno di mostrare una finestra di notifica del lancio del server, perché dura appunto pochi secondi, ma mi sfiziava farlo, per accrescere le mie competenze in Java e un po' per soddisfazione personale.

    L'idea mi è venuta pensando alle procedure di installazione dei vari software che mentre scaricano i file, li spacchettano, li copiano e poi eseguono le varie configurazioni, mostrano una finestra in cui descrivono le varie operazioni che stanno facendo.

    Mi piacerebbe fare una cosa simile.
    Quindi devo creare due thread che comunicano tra loro?

Devi accedere o registrarti per scrivere nel forum
2 risposte