Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480

    CLOSED_OPTION per WARNING.MESSAGE

    Ciao a tutti, ho un problema con questa situazione:
    codice:
    if (fileListMese.exists() == false) {
                            JOptionPane.showMessageDialog(this,
                                    "The radiation data for the month of " + m + " are not present",
                                    "Attention",
                                    JOptionPane.WARNING_MESSAGE,
                                    icon);
                            for (i = 0; i < righe; i++) {
                                tabellaMesi.setValueAt(" ", i, 0);
                                tabellaMesi.setValueAt(" ", i, 1);
                                tabellaMesi.setValueAt(" ", i, 2);
                                tabellaMesi.setValueAt(" ", i, 3);
                                tabellaMesi.setValueAt(" ", i, 4);
                            }
                        }
    Eseguo questo ciclo per 12 volte (mesi dell'anno) se ovviamente il metodo che apre in sequenza i file relativi ad ogni mese non trova il file del mese specificato. Ovviamente il messaggio del relativo mese non viene visualizzato se il file di quel mese è presente. Il problema è che se non sono presenti tutti i 12 mesi, comunque mi apre in sequenza il "warning message". Vorrei capire se è possibile utilizzare una CLOSED_OPTION, in modo tale da permettere all'utente di uscire da questa sequenza di messaggi in anticipo: E' possibile farlo ?

    Grazie
    Ultima modifica di roquentin; 26-03-2015 a 21:07

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Il problema è che se non sono presenti tutti i 12 mesi, comunque mi apre in sequenza il "warning message". Vorrei capire se è possibile utilizzare una CLOSED_OPTION
    Il CLOSED_OPTION non c'entra niente (e nemmeno JOptionPane di per sé). È solamente questione di "logica" ....

    Una soluzione banale? Tieni una lista di String in cui man mano inserisci la stringa "The radiation .... not present" quando quel mese non è presente. Alla fine, se la lista non è vuota (=ci sono stati file mancanti) fai vedere 1 solo warning message sfruttando il fatto che nel 'message' puoi passare un String[] (non un List<String> occhio) per avere le scritte una per linea.

    Ma puoi farlo in mille altri modi ...
    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
    Registrato dal
    Jul 2014
    Messaggi
    480
    Non è esattamente quello che vorrei fare.
    Vorrei dare l'opportunità all'utente di chiudere la sequenza dei messaggi per qualsiasi mese.
    Per esempio l'utente potrebbe anche decidere di visualizzare i messaggi per Gennaio, Febbraio, Marzo, Aprile, poi visualizza anche quello di Maggioe decide che vuole interrompere la sequenza cliccando sulla "X".
    Mi sa tanto che con il WARNING.MESSAGE non è possibile farlo...che ne dici?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Vorrei dare l'opportunità all'utente di chiudere la sequenza dei messaggi per qualsiasi mese.
    Per esempio l'utente potrebbe anche decidere di visualizzare i messaggi per Gennaio, Febbraio, Marzo, Aprile, poi visualizza anche quello di Maggioe decide che vuole interrompere la sequenza cliccando sulla "X".
    Ah, ok, ora mi è più chiaro. Però avrei ancora un dubbio: quando l'utente decide di "chiudere" la sequenza, intendi che non verranno più visualizzati ulteriori warning (ma vada comunque avanti con il processamento dei restanti mesi) oppure che termini proprio tutto il ciclo di processamento dei mesi?

    Comunque tieni presente che gli showMessageDialog hanno tipo di ritorno void, quindi non puoi sapere nulla in quel senso!

    Le possibilità comunque ci sono:
    - usare un altro dei showXXXDialog, magari con più pulsanti es. "Continua", "Termina".
    - usare ancora showMessageDialog mettendo però nel message un JCheckBox del tipo (come succede in molti software) es. "Non mostrare più per questa sequenza" e testarlo dopo il showMessageDialog (ti ricordo che il message è Object e può essere molte cose, vedi javadoc).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ah, ok, ora mi è più chiaro. Però avrei ancora un dubbio: quando l'utente decide di "chiudere" la sequenza, intendi che non verranno più visualizzati ulteriori warning (ma vada comunque avanti con il processamento dei restanti mesi) oppure che termini proprio tutto il ciclo di processamento dei mesi?

    Comunque tieni presente che gli showMessageDialog hanno tipo di ritorno void, quindi non puoi sapere nulla in quel senso!

    Le possibilità comunque ci sono:
    - usare un altro dei showXXXDialog, magari con più pulsanti es. "Continua", "Termina".
    - usare ancora showMessageDialog mettendo però nel message un JCheckBox del tipo (come succede in molti software) es. "Non mostrare più per questa sequenza" e testarlo dopo il showMessageDialog (ti ricordo che il message è Object e può essere molte cose, vedi javadoc).
    Si esatto, cioè non deve più visualizzare il messaggio dei mesi ma va avanti con il processamento dei mesi che seguono (se ce ne sono).
    Ho fatto così:
    codice:
                if (contaMesi == 12) {
                    List<Mese> mese = ricercaMese.findDirectory(dir, pathname.getData());
                    for (i = 0; i < righe; i++) {
                        tabellaMesi.setValueAt(mese.get(i).getNomeMese(), i, 0);
                        tabellaMesi.setValueAt(mese.get(i).getMediaMeseIrradianzaG(), i, 1);
                        tabellaMesi.setValueAt(mese.get(i).getMediaMeseIrradianzaGd(), i, 2);
                        tabellaMesi.setValueAt(mese.get(i).getMediaMeseIrradianzaGc(), i, 3);
                        tabellaMesi.setValueAt(mese.get(i).getOreTotaliMese(), i, 4);
                    }
                } else {
                    i = 0; int j = 0;
                    for (ApriFileMese.MeseDellAnno m : ApriFileMese.MeseDellAnno.values()) {
                        fileMese = (dir + File.separator + pathname.getData() + File.separator + m + ".txt");
                        File fileListMese = new File(fileMese);
                        System.out.println(fileListMese);
                        System.out.println(m);
                        
                            if (fileListMese.exists() == false) {
                                
                                JOptionPane.showMessageDialog(this,
                                        "The radiation data for the month of " + m + " are not present",
                                        "Attention",
                                        JOptionPane.WARNING_MESSAGE,
                                        icon);
    
                                tabellaMesi.setValueAt(" ", i, 0);
                                tabellaMesi.setValueAt(" ", i, 1);
                                tabellaMesi.setValueAt(" ", i, 2);
                                tabellaMesi.setValueAt(" ", i, 3);
                                tabellaMesi.setValueAt(" ", i, 4);
                                i++;
                            } else if (fileListMese.exists() == true) {
                                List<Mese> mese = ricercaMese.findDirectory(dir, pathname.getData());
                                
                                    tabellaMesi.setValueAt(mese.get(j).getNomeMese(), i, 0);
                                    tabellaMesi.setValueAt(mese.get(j).getMediaMeseIrradianzaG(), i, 1);
                                    tabellaMesi.setValueAt(mese.get(j).getMediaMeseIrradianzaGd(), i, 2);
                                    tabellaMesi.setValueAt(mese.get(j).getMediaMeseIrradianzaGc(), i, 3);
                                    tabellaMesi.setValueAt(mese.get(j).getOreTotaliMese(), i, 4);
                                    i++;
                                    j++;
                                }
                            System.out.println(i);
                            
                        }
                    }
    quindi se i mesi esistono tutti me li apre e mi mette i dati nella JTable. Se invece non sono 12 allora comincia a dirmi tramite warning message (uno per volta) quello che manca, se qualcuno è presente mi prende i dati e me li inserisce e passa al successivo ..fino a Dicembre.
    Però se l'utente decidesse di non visualizzare più i messaggi, comunque deve andare avanti nel processarli. E' solo una questione di far decidere all'utente di smettere di visualizzare i messaggi dei mesi mancanti se si scoccia.

    p.s. anche io avevo pensato ad un altro showXXXDialog, ma volevo capire se si poteva fare con il Warning Message prima..che ne pensi ???

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Però se l'utente decidesse di non visualizzare più i messaggi, comunque deve andare avanti nel processarli. E' solo una questione di far decidere all'utente di smettere di visualizzare i messaggi dei mesi mancanti se si scoccia.
    Ok, allora le due opzioni che ho detto prima (altro showXXXDialog con più pulsanti oppure showMessageDialog con checkbox) restano comunque valide!


    P.S. Il codice che hai postato poco fa risulta abbastanza fumoso e con evidenti ripetizioni di comportamento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Quote Originariamente inviata da andbin Visualizza il messaggio
    oppure showMessageDialog con checkbox) restano comunque valide!


    P.S. Il codice che hai postato poco fa risulta abbastanza fumoso e con evidenti ripetizioni di comportamento.
    Ma a questo punto dovrei aggiungere una checkBox subito dopo ogni messaggio ?

    P.S. Mi diresti dove ti sembra fumoso e come potrei migliorarlo ?

    Grazie

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Ma a questo punto dovrei aggiungere una checkBox subito dopo ogni messaggio ?
    È sufficiente che il 'message' contenga la stringa "The radiation .... " e anche un JCheckBox. Il JCheckBox chiaramente lo devi tenere per poterlo usare dopo la invocazione di showMessageDialog.

    Piuttosto, cosa più importante, se questo tipo di "message box" ha senso in più parti della tua applicazione, allora sarebbe meglio incapsulare questa logica in una apposita classe. Anche perché devi tenere uno "stato" che dice se mostrare di nuovo la dialog oppure no. E fare una classe apposita permette anche l'incapsulamento di questo stato.

    Quote Originariamente inviata da roquentin Visualizza il messaggio
    P.S. Mi diresti dove ti sembra fumoso e come potrei migliorarlo ?
    Le vedi sicuramente anche tu le duplicazioni: tutti quei mese.get( .. ) ripetuti, il test di fileListMese.exists() in entrambi i rami del if-else, ecc...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Quote Originariamente inviata da andbin Visualizza il messaggio
    È sufficiente che il 'message' contenga la stringa "The radiation .... " e anche un JCheckBox. Il JCheckBox chiaramente lo devi tenere per poterlo usare dopo la invocazione di showMessageDialog.
    Non mi piace molto l'idea della visualizzazione del JCheckBox ogni volta che viene visualizzato il messaggio (se ho capito bene)

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Piuttosto, cosa più importante, se questo tipo di "message box" ha senso in più parti della tua applicazione, allora sarebbe meglio incapsulare questa logica in una apposita classe. Anche perché devi tenere uno "stato" che dice se mostrare di nuovo la dialog oppure no. E fare una classe apposita permette anche l'incapsulamento di questo stato.
    Questo "message box" non la utilizzo in altre parti della applicazione, però mi è venuta l'idea per un'altra classe (relativa alla procedura di ingresso) dell'applicazione

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Le vedi sicuramente anche tu le duplicazioni: tutti quei mese.get( .. ) ripetuti, il test di fileListMese.exists() in entrambi i rami del if-else, ecc...
    Si infatti hai perfettamente ragione. Purtroppo non riesco ancora ad entrare nella logica del linguaggio ad oggetti...ma ci riuscirò

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Non mi piace molto l'idea della visualizzazione del JCheckBox ogni volta che viene visualizzato il messaggio (se ho capito bene)
    Non so bene cosa hai capito .... comunque prova l'esempio qui sotto.

    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Purtroppo non riesco ancora ad entrare nella logica del linguaggio ad oggetti...
    Le duplicazioni che hai fatto a dire il vero non sono colpa della programmazione ad oggetti .... ma c'entrano con la programmazione in generale. Poi, certamente, se non hai ancora una idea chiara della programmazione ad oggetti, questa sì è una fatica (e problema) in più, che devi risolvere con il tempo ma possibilmente il prima possibile.


    codice:
    import java.awt.Component;
    import javax.swing.Icon;
    import javax.swing.JCheckBox;
    import javax.swing.JOptionPane;
    
    public class MessageBox {
        private String title;
        private Icon icon;
        private String dontShowAgainCheckboxText;
        private boolean showable = true;
    
        public MessageBox() {}
    
        public MessageBox(String title) {
            this.title = title;
        }
    
        public MessageBox(String title, Icon icon) {
            this.title = title;
            this.icon = icon;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public Icon getIcon() {
            return icon;
        }
    
        public void setIcon(Icon icon) {
            this.icon = icon;
        }
    
        public String getDontShowAgainCheckboxText() {
            return dontShowAgainCheckboxText;
        }
    
        public void setDontShowAgainCheckboxText(String dontShowAgainCheckboxText) {
            this.dontShowAgainCheckboxText = dontShowAgainCheckboxText;
        }
    
        public void showWarning(Component parentComponent, String messageText) {
            internalMessageDialog(parentComponent, messageText, JOptionPane.WARNING_MESSAGE);
        }
    
        private void internalMessageDialog(Component parentComponent, String messageText, int messageType) {
            if (showable) {
                Object message;
                JCheckBox dontShowAgainCheckbox = null;
    
                if (dontShowAgainCheckboxText != null) {
                    dontShowAgainCheckbox = new JCheckBox(dontShowAgainCheckboxText);
                    message = new Object[] { messageText, dontShowAgainCheckbox };
                } else {
                    message = messageText;
                }
    
                JOptionPane.showMessageDialog(parentComponent, message, title, messageType, icon);
    
                if (dontShowAgainCheckbox != null && dontShowAgainCheckbox.isSelected()) {
                    showable = false;
                }
            }
        }
    }

    Un main di prova:

    codice:
    public class ProvaMessageBox {
        public static void main(String[] args) {
            MessageBox messageBox = new MessageBox("AVVISO");
            messageBox.setDontShowAgainCheckboxText("Non visualizzare più fino al termine del ciclo");
    
            for (int i = 1; i <= 10; i++) {
                System.out.println("Processamento " + i);
    
                messageBox.showWarning(null, "Avviso n." + i);
            }
        }
    }

    La classe MessageBox è abbastanza semplice ma è già funzionante. Si potrebbe infarcirla ed espanderla ancora di più e come si vuole. Si potrebbero aggiungere dei metodi showError, showInformation, ecc...
    Tutto questo ha principalmente un solo obiettivo: rendere più semplice e pratica la gestione delle message box. È vero che la classe MessageBox ha già 70 righe e se la espandi crescerebbe ancora di più, ma poi è tutto lì, ben racchiuso. E il resto della tua applicazione ne beneficia perché offri una gestione più compatta e semplice delle message box.

    Non è solo questione di scrivere meno codice (ogni volta non devi ricordarti tutti i parametri e le varianti di JOptionPane.showMessageDialog, non devi ripetere JOptionPane.WARNING_MESSAGE ecc...) ma anche di aver incapsulato della logica in un solo punto e oltretutto ben riutilizzabile.
    La logica del "don't show again" (il non mostrare più successivamente) è tutta dentro MessageBox ed è ben nascosta.
    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.