Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problema confronto tra due date scritte in JComboBox

    allora, ho questa situazione, mi trovo a dover compilare 6 JComboBox che costituiscono due date. il problema è che la seconda data non può mai essere inferiore alla prima.

    per il momento ho scritto questo codice:
    codice:
     /**
         *
         * @param giorno1 giorno della prima data
         * @param mese1 mese della prima data
         * @param anno1 anno della prima data
         * @param giorno2 giorno della seconda data
         * @param mese2 mese della seconda data
         * @param anno2 anno della seconda data
         * @return il metodo ritorna true se la prima data è antecedente alla
         * seconda, false altrimenti
         */
        private boolean compare2Dates(String giorno1, String mese1, String anno1, String giorno2, String mese2, String anno2) {
            Calendar c1 = Calendar.getInstance();
            Calendar c2 = Calendar.getInstance();
            c1.set(Integer.parseInt(anno1), Integer.parseInt(mese1), Integer.parseInt(giorno1));
            c2.set(Integer.parseInt(anno2), Integer.parseInt(mese2), Integer.parseInt(giorno2));
            if (c1.before(c2)) {
                return true;//prima data minore della seconda
            } else {
                return false;//seconda data maggiore o uguale della prima
            }
        }
    codice:
     /**
         *
         * da inserire nei changeItemState dei vari comboBox
         */
        private void verificaData() {
            String giorno1 = (String) this.giorniInizio.getSelectedItem();
            String mese1 = (String) this.meseInizio.getSelectedItem();
            String anno1 = (String) this.annoInizio.getSelectedItem();
            String giorno2 = (String) this.giorniScadenza.getSelectedItem();
            String mese2 = (String) this.mesiScadenza.getSelectedItem();
            String anno2 = (String) this.annoScadenza.getSelectedItem();
            if (!(compare2Dates(giorno1, convertiMese(mese1), anno1, giorno2, convertiMese(mese2), anno2))) {
                this.giorniScadenza.setSelectedItem(this.giorniInizio.getSelectedItem());
                this.mesiScadenza.setSelectedItem(this.meseInizio.getSelectedItem());
                this.annoScadenza.setSelectedItem(this.annoInizio.getSelectedItem());
            }
        }
    codice:
     /**
         *
         * @param mese Converte in numero in formato stringa un mese ricevuto in
         * formato stringa
         * @return Ritorna la stringa "1" se il parametro è Gennaio
         */
        private String convertiMese(String mese) {
            if (mese.equalsIgnoreCase("Gennaio")) {
                return "1";
            }
            if (mese.equalsIgnoreCase("febbraio")) {
                return "2";
            }
    
            if (mese.equalsIgnoreCase("marzo")) {
                return "3";
            }
    
            if (mese.equalsIgnoreCase("aprile")) {
                return "4";
            }
    
            if (mese.equalsIgnoreCase("maggio")) {
                return "5";
            }
    
            if (mese.equalsIgnoreCase("giugno")) {
                return "6";
            }
    
            if (mese.equalsIgnoreCase("luglio")) {
                return "7";
            }
    
            if (mese.equalsIgnoreCase("agosto")) {
                return "8";
            }
    
            if (mese.equalsIgnoreCase("settembre")) {
                return "9";
            }
    
            if (mese.equalsIgnoreCase("ottobre")) {
                return "10";
            }
    
            if (mese.equalsIgnoreCase("novembre")) {
                return "11";
            }
    
            if (mese.equalsIgnoreCase("dicembre")) {
                return "12";
            }
            return "-1";
        }
    Poi per ogni changeItemState io richiamo il metodo verificaData(), ma dopo un paio di richiami mi và in java.lang.StackOverflowError.

    Cosa potrebbe essere secondo la vostra esperienza? Io penso che ci sia un sovraccarico di richieste e quindi una carenza di risorse...avete metodi alternativi per fare quello che serve a me? Considerate che la struttura delle date non può modificarsi più di tanto....volevo provare ad usare JCalendar ma non credo che implementi in automatico una gestione delle date che possa soddisfare le mie richeste

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    comincerei a rivedere pesantemente la cosa: se puoi, utilizza un solo campo (esistono anche dei calendari/date chooser già fatti che tra l'altro consentono anche di utilizzare la giusta localizzazione - Italia in questo caso). Ti eviti inutili controlli quali 30 febbraio, 31 novembre etc etc e ti ritrovi con oggetti Date che consentono immediatamente di fare i controlli del caso.

    Per esempio un componente molto noto è i JCalendar di: http://www.toedter.com/

    di cui puoi vedere una demo qui: http://www.toedter.com/en/jcalendar/demo.html
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    purtroppo ho dovuto adottare per forza questa soluzione.
    JCalendar l'ho usato e avrei preferito usarlo anche io...ma non comando io

    per i vari controlli, li ho già fatti tutti, e per quanto pesante e macchinosa sia la cosa....li ricopio qui in caso di utilità:

    comparazione tra due date
    codice:
        private boolean compare2Dates(String giorno1, String mese1, String anno1, String giorno2, String mese2, String anno2) {
            Calendar c1 = Calendar.getInstance();
            Calendar c2 = Calendar.getInstance();
            c1.set(Integer.parseInt(anno1), Integer.parseInt(mese1), Integer.parseInt(giorno1));
            c2.set(Integer.parseInt(anno2), Integer.parseInt(mese2), Integer.parseInt(giorno2));
            if (c1.before(c2)) {
                return true;//prima data minore della seconda
            } else {
                return false;//seconda data maggiore o uguale della prima
            }
        }
    verifica delle mensilità (aprile 30 giorni...)
    codice:
        private void verificaMensilita() {
            String mese1 = (String) this.meseInizio.getSelectedItem();
            String mese2 = (String) this.mesiScadenza.getSelectedItem();
            
            String giorno1 = (String) this.giorniInizio.getSelectedItem();
            String giorno2 = (String) this.giorniScadenza.getSelectedItem();
            
            if (mese1.equalsIgnoreCase("Aprile")
                    || mese1.equalsIgnoreCase("giugno")
                    || mese1.equalsIgnoreCase("settembre")
                    || mese1.equalsIgnoreCase("novembre")
                    || mese2.equalsIgnoreCase("Aprile")
                    || mese2.equalsIgnoreCase("giugno")
                    || mese2.equalsIgnoreCase("settembre")
                    || mese2.equalsIgnoreCase("novembre")) {
                if (giorno1.equalsIgnoreCase("31")) {
                    this.giorniInizio.setSelectedItem("30");
                }
                if (giorno2.equalsIgnoreCase("31")) {
                    this.giorniScadenza.setSelectedItem("30");
                }
            }
        }
    verifica per il mese di febbraio della sua bisestilità
    codice:
        private void verificaBisestilita() {
            
            String mese1 = (String) this.meseInizio.getSelectedItem();
            String mese2 = (String) this.mesiScadenza.getSelectedItem();
            
            String giorno1 = (String) this.giorniInizio.getSelectedItem();
            String giorno2 = (String) this.giorniScadenza.getSelectedItem();
            
            
            String anno2 = (String) this.annoScadenza.getSelectedItem();
            String anno1 = (String) this.annoInizio.getSelectedItem();
            
            GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
            if (mese1.equalsIgnoreCase("febbraio")) {
                if (gc.isLeapYear(Integer.parseInt(anno1))) {
                    if (giorno1.equalsIgnoreCase("31") || giorno1.equalsIgnoreCase("30")) {
                        this.giorniInizio.setSelectedItem("29");
                    }
                } else {
                    if (giorno1.equalsIgnoreCase("31") || giorno1.equalsIgnoreCase("30") || giorno1.equalsIgnoreCase("29")) {
                        this.giorniInizio.setSelectedItem("28");
                    }
                }
            }
            if (mese2.equalsIgnoreCase("febbraio")) {
                if (gc.isLeapYear(Integer.parseInt(anno2))) {
                    if (giorno2.equalsIgnoreCase("31") || giorno2.equalsIgnoreCase("30")) {
                        this.giorniScadenza.setSelectedItem("29");
                    }
                } else {
                    if (giorno2.equalsIgnoreCase("31") || giorno2.equalsIgnoreCase("30") || giorno2.equalsIgnoreCase("29")) {
                        this.giorniScadenza.setSelectedItem("28");
                    }
                }
                
            }
            
        }
    questo è il metodo che richiama tutto (il converti è rimasto invariato)
    codice:
      private void verificaData() {
            verificaMensilita();
            verificaBisestilita();
            String giorno1 = (String) this.giorniInizio.getSelectedItem();
            String mese1 = (String) this.meseInizio.getSelectedItem();
            String anno1 = (String) this.annoInizio.getSelectedItem();
            String giorno2 = (String) this.giorniScadenza.getSelectedItem();
            String mese2 = (String) this.mesiScadenza.getSelectedItem();
            String anno2 = (String) this.annoScadenza.getSelectedItem();
            if (!(compare2Dates(giorno1, convertiMese(mese1), anno1, giorno2, convertiMese(mese2), anno2))) {
                this.giorniScadenza.setSelectedItem(this.giorniInizio.getSelectedItem());
                this.mesiScadenza.setSelectedItem(this.meseInizio.getSelectedItem());
                this.annoScadenza.setSelectedItem(this.annoInizio.getSelectedItem());
            }
        }
    sò che è una soluzione scomoda e poco rapida, ma tra esigenze di tempo e richieste "dall'alto" ho dovuto utilizzare questa soluzione.

    per il problema originale, credo che fosse la macchina sulla quale operavo che dava problemi...ho cambiato pc e funziona tutto (quell'altro è morto miracolosamente)

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    cambia capo

    mi sa che non ne esce mai da verificaData. Se proprio devi perpetrare questo crimine verso java e la programmazione sensata, togli i listener dalle varie combo e verifica solo alla fine che sta succedendo.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    devo aspettare il 10 agosto...sto contando i giorni.

    amo java, e sò che mi perdonerà questo piccolo tradimento <3

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.