Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Hybrid View

  1. #1

    Creare una finestra di Pop Up

    Ciao a tutti,
    ho creato una finestra che dovrebbe imitare la finestra di Pop Up JOptionPane.show.MessageDialog. L'ho fatto per stare in linea con il layout. Ma come faccio a mettere in pausa il Thread principale finchè l'utente non dia una risposta con questa finestra? O al massimo c'è un modo per modificare la struttura della finestra di dialogo predefinita (JOptionPane.show.MessageDialog)?

    edit: avevo pensato di ovviare alla questione dei thread passando la serie di istruzioni che servono come parametro in un metodo, è possibile?
    Ultima modifica di ChristianC; 04-09-2014 a 01:54

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    65
    credo possa andare bene thread.join() nel thread principale in modo da attendere che quello che lanci sia concluso...

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da ChristianC Visualizza il messaggio
    ho creato una finestra che dovrebbe imitare la finestra di Pop Up JOptionPane.show.MessageDialog. L'ho fatto per stare in linea con il layout. Ma come faccio a mettere in pausa il Thread principale finchè l'utente non dia una risposta con questa finestra?
    Non so cosa hai usato ma .... dovresti usare JDialog e naturalmente in maniera "modale".

    Che intendi per "Thread principale"? Swing ha il suo thread (il Event Dispatch Thread), che devi usare per la interfaccia grafica e non devi mai tenere tu "impegnato" per troppo tempo. Quando si usa una dialog "modale", invocando sulla dialog setVisible(true) (chiaramente dal EDT) questo metodo è bloccante, ovvero ritorna solo quando la dialog viene chiusa. Ma il "loop" della gestione degli eventi è interno alla dialog, quindi tutti i disegni ed eventi continuano a funzionare. Riscrivere questa logica non lo vedo nemmeno pensabile ....

    Quote Originariamente inviata da ChristianC Visualizza il messaggio
    O al massimo c'è un modo per modificare la struttura della finestra di dialogo predefinita (JOptionPane.show.MessageDialog)?
    Dipende cosa intendi: il contenuto (il "messaggio")? La possibile icona o la sua eventuale disposizione? La posizione/testo/numero dei pulsanti visualizzati?

    Il contenuto, cioè il messaggio, è ampiamente configurabile. Il parametro "message" è un Object, se noti. Tipicamente è una stringa ma può essere anche ben altro: un array di stringhe, un componente GUI, un array di componenti, ecc... (vedi documentazione javadoc).
    Una icona la puoi applicare ma la sua posizione non la puoi cambiare (è sempre a fianco del contenuto).
    Di pulsanti ne puoi configurare quanti ne vuoi, ma dipende dal showXYZ che si usa (quelli che hanno il parametro 'options'). E il parametro options è un Object[], puoi anche passare altri componenti (es. un JCheckBox).
    Ultima modifica di andbin; 04-09-2014 a 09:39
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Cattura.JPG

    Questa è la mia finestra di dialogo. E' possibile ricrearla utilizzando un JDialog? Magari potendo inserire un immagine di sfondo nella JDialog. Un'altra domanda, è possibile passare come parametro in un metodo una serie di istruzioni?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da ChristianC Visualizza il messaggio
    E' possibile ricrearla utilizzando un JDialog?
    Certo. Esistono diversi esempi on-line e, soprattutto, nel tutorial sull'uso delle Dialog.


    Magari potendo inserire un immagine di sfondo nella JDialog.

    Certamente, esattamente come faresti per una normalissima finestra o un pannello.


    Un'altra domanda, è possibile passare come parametro in un metodo una serie di istruzioni?
    No.
    Java, a differenza di altri linguaggi come C/C++ non permette il passaggio di puntatori a funzione. Ma non ce n'è la necessità: il tutto si risolve mediante l'uso delle interfacce. Un piccolo esempio:

    Definisco una interfaccia che espone un metodo "eseguiComandi()"

    codice:
    public interface Esecutore {
       void eseguiComandi();
    }

    Quando avrò bisogno di "passare ad un oggetto" un elenco di comandi da eseguire, semplicemente implemento tale interfaccia in una classe concreta (anche anonima) e lo passo... l'oggetto si limiterà a richiamare il metodo "eseguiComandi()" sull'istanza passata:


    codice:
    public class ChiEsegue {
       ...
       public void setComandi(Esecutore e) {
          // Eseguo l'elenco di "comandi"
          e.eseguiComandi();
       }
    }
    
    ...
    
    public class ChiFaEseguire {
       ...
       private ChiEsegue chiEsegue = ...;
       ...
       public void metodo() {
          // Devo far esegure a "chiEsegue" un elenco di comandi
          Esecutore e = new Esecutore() {
             @Override
             public void eseguiComandi() {
                ...   // Elenco di comandi che dovranno essere eseguiti da "chiEsegue"
             }
          }
    
          chiEsegue.setComandi( e );
       }
    }

    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

  6. #6
    Ho un dubbio, quando richiami alla fine del metodo "metdo()" setComandi lo farà eseguire immediatamente, senza aspettare una risposta dall'utente. Avrei risolto il problema in un modo molto empirico e molto poco elegante, però vorrei approfondire questo metodo con le interfacce.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Beh, io ho fatto in modo che il metodo "setComandi()" eseuga immediatamente l'elenco di istruzioni... tu se vuoi attendere la conferma dell'utente, fai pure. Mettici tutto quello che vuoi. Potrei anche generalizzare il tutto, estendere l'interfaccia e rendere la cosa più "complessa":


    codice:
    public interface Esecutore {
       void eseguiComandi();
       String getMessaggio();
    }

    Ho aggiunto un metodo all'interfaccia che prevede la restituzione di un messaggio da dare all'utente di cui ci si aspetta una risposta prima di procedere.
    Così, modifico sia la classe che esegue, che quella che la richiama:


    codice:
    public class ChiEsegue {
       ...
       public void setComandi(Esecutore e) {
          // Prima di procedere, chiedo conferma all'utente,
          // mostrandogli il messaggio
          int retType = JOptionPane.showConfirmDialog(null, e.getMessaggio(), "Richiesta conferma", JOptionPane.YES_ON_OPTION)
    
          // Se l'utente risponde di SI, eseguo, altrimenti no.
          if (retType == JOptionPane.YES_OPTION) {
             // Eseguo l'elenco di "comandi"
             e.eseguiComandi();
          }
       }
    }
    
    ...
    
    public class ChiFaEseguire {
       ...
       private ChiEsegue chiEsegue = ...;
       ...
       public void metodo() {
          // Devo far esegure a "chiEsegue" un elenco di comandi
          Esecutore e = new Esecutore() {
             @Override
             public void eseguiComandi() {
                ...   // Elenco di comandi che dovranno essere eseguiti da "chiEsegue"
             }
    
             // Il messaggio da presentare all'utente
             @Override
             public String getMessage() {
                return "Vuoi avviare la procedura di salvataggio?";
             }
          }
    
          chiEsegue.setComandi( e );
       }
    }

    Ciao.
    Ultima modifica di LeleFT; 04-09-2014 a 13:49
    "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

  8. #8
    E qui però si ricade nell'utilizzo delle JDialog. Ho provato in un altro modo: ho creato un metodo (Esegui) che comprende le istruzioni da far eseguire nella classe ChiFaEseguire. Quando creo la finestra di PopUp le passo l'oggetto della classe ChiFaEseguire. Attivo il metodo ChiFaEseguire.Esegui nella classe ChiEsegue solo quando l'utente da la conferma. Il problema è la non universalità di questo metodo per niente elegante. Che ne pensi?

    Ottimo trolley comunque!

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da ChristianC Visualizza il messaggio
    E qui però si ricade nell'utilizzo delle JDialog. Ho provato in un altro modo: ho creato un metodo (Esegui) che comprende le istruzioni da far eseguire nella classe ChiFaEseguire. Quando creo la finestra di PopUp le passo l'oggetto della classe ChiFaEseguire. Attivo il metodo ChiFaEseguire.Esegui nella classe ChiEsegue solo quando l'utente da la conferma. Il problema è la non universalità di questo metodo per niente elegante. Che ne pensi?
    Le due cose sono molto simili e dipende tutto dal contesto.
    Io, sinceramente, non ho mai avuto bisogno di passare ad una classe un insieme di istruzioni da eseguire... ci sono modi molto più utili e manutenibili per fare la stessa cosa (tipo creare metodi diversi con istruzioni diverse e richiamare, di volta in volta, quello corretto... tanto la logica che usi per scrivere le istruzioni già è incapsulata nel sorgente... tanto vale far fare "in sequenza logica" le operazioni.


    Ottimo trolley comunque!

    Sì, dannato copia-incolla di link da Skype... mi pareva strano che il paste non avesse funzionato al primo colpo.


    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

  10. #10
    Credo che continuerò ad usare il mio metodo. Anche se un po' rozzo funziona. Grazie mille per la pazienza ad entrambi.

    Ciao
    Ultima modifica di ChristianC; 04-09-2014 a 14:06

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.