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

    JComboBox impostato sui giorni di un mese preciso

    Salve programmatori... sono di fronte a un problema che probabilmente è banale ma che .. ahimè non riesco a risolvere.
    Semplicemente ho un JPanel in cui va richiesto l'immissione di una data attraverso dei JComboBox.
    Prima l'anno, poi il mese ed infine i giorni. (che variano da mese a mese).. ebbene... i giorni... non so come inserirli nel JComboBox. Ho provato a mettere un controllo che verifichi che si sia passato al mese successivo ma mi mette nel JComboBox solo alcuni giorni.. non tutti... Vi posto il frammento di codice:
    codice:
    inputGiorno = new JComboBox<Integer>();
    GregorianCalendar dd = new GregorianCalendar();
    dd.set(annoScelto,meseScelto,1);//impostato sul primo giorno del mese scelto
    uscita:
    for(int i=1; i<=31; i++)
    {
        dd.add(Calendar.DAY_OF_MONTH,i); //aggiungo i giorni per poi effettuare una verifica
        inputGiorno.addItem(i);
        if(dd.get(Calendar.MONTH)!=meseScelto)
        {
            break uscita;
        }
    }
    this.add(inputGiorno);

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  2. #2
    mi rispondo da solo... ho semplicemente commesso un errore nel codice:
    codice:
    dd.add(Calendar.DAY_OF_MONTH,i);
    


    ...invece di aumentare di un giorno aumentavo della variabile "i".... che logicamente non rimane 1.. quindi

    codice:
    dd.add(Calendar.DAY_OF_MONTH,1);




    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  3. #3
    Adesso però mi si pone un altro problema... ben più impegnativo...
    come ho detto precedentemente ho tre JComboBox in un pannello... il primo chiede l'anno, il secondo il mese e il terzo il giorno.... ebbene, come posso far si che il JComboBox del giorno si "riscriva" con le impostazioni date dal meseScelto? Cioè, se scelgo febbraio dal JComboBox mese vorrei che mi si aggiornasse il JComboBox giorno con le scelte dei giorni da 1 a 28.
    ???

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    La questione non è esattamente così semplice: se l'anno selezionato è bisestile, immagino che la combobox dei giorni debba visualizzare i valori da 1 a 29 (e non solo fino a 28).

    Se vuoi essere "coerente" con gli anni bisestili, puoi aiutarti in questo modo: costruisci un Calendar posizionato nel giorno 1 del mese scelto e dell'anno scelto. Quindi, verifica qual è il valore massimo per il campo "giorno" di quel calendar:

    codice:
    int annoScelto = ...;
    int meseScelto = ...;   // Mese = numero - 1!!!
    
    // Mi posiziono al giorno 1 del mese/anno scelto
    GregorianCalendar gc = new GregorianCalendar(annoScelto, meseScelto, 1);
    
    // Ottengo il massimo giorno di quel mese
    int maxGiorno = gc.getMaximum( Calendar.DATE );
    
    // Ora costruisci la lista di valori (esempio, come array di string):
    String[] giorni = new String[ maxGiorno ];
    for(int i=0; i<maxGiorno; i++) giorni[i] = String.valueOf(i+1);
    
    // Usa l'array per la JComboBox
    ...

    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

  5. #5
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    La questione non è esattamente così semplice: se l'anno selezionato è bisestile, immagino che la combobox dei giorni debba visualizzare i valori da 1 a 29 (e non solo fino a 28).

    Se vuoi essere "coerente" con gli anni bisestili, puoi aiutarti in questo modo: costruisci un Calendar posizionato nel giorno 1 del mese scelto e dell'anno scelto. Quindi, verifica qual è il valore massimo per il campo "giorno" di quel calendar:

    codice:
    int annoScelto = ...;
    int meseScelto = ...;   // Mese = numero - 1!!!
    
    // Mi posiziono al giorno 1 del mese/anno scelto
    GregorianCalendar gc = new GregorianCalendar(annoScelto, meseScelto, 1);
    
    // Ottengo il massimo giorno di quel mese
    int maxGiorno = gc.getMaximum( Calendar.DATE );
    
    // Ora costruisci la lista di valori (esempio, come array di string):
    String[] giorni = new String[ maxGiorno ];
    for(int i=0; i<maxGiorno; i++) giorni[i] = String.valueOf(i+1);
    
    // Usa l'array per la JComboBox
    ...

    Ciao.
    Ciao Lele, ho inteso benissimo cosa volevi dire... e se posso permettermi la questione è molto più semplice... ossia basta fare un controllo e aggiungere i giorni fino a quando cambia l'"int" del mese
    codice:
    uscita:
    for(int i=1; i<=31; i++)
    {
           giornoMax++;
           dd.add(Calendar.DAY_OF_MONTH,1);
           if(dd.get(Calendar.MONTH)!=(mese-1))
           {
                break uscita;
           }
    }
    in questo caso giornoMax viene impostato sul massimo dei giorni del mese....

    Beh.. dopo questa breve parentesi ... il mio problema non è questo ma bensì come poter aggiornare in fase di esecuzione il JComboBox dei giorni... in base alla scelta del mese e dell'anno scelto...
    Logicamente il pannello lo deve rendere visibile immediatamente alla sua creazione... e se un utente cambia il mese... beh... come (durante l'esecuzione) poter modificare il JComboBox del giorno???
    Ultima modifica di miticogilles; 04-02-2014 a 01:37

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da miticogilles Visualizza il messaggio
    Ciao Lele, ho inteso benissimo cosa volevi dire... e se posso permettermi la questione è molto più semplice... ossia basta fare un controllo e aggiungere i giorni fino a quando cambia l'"int" del mese

    codice:
    uscita:
    for(int i=1; i<=31; i++)
    {
           giornoMax++;
           dd.add(Calendar.DAY_OF_MONTH,1);
           if(dd.get(Calendar.MONTH)!=(mese-1))
           {
                break uscita;
           }
    }

    Beh... perchè tutta quella complessità: se guardi bene, io di if non ne ho proprio usate e nemmeno ho usato cicli for per ottenere il massimo giorno del mese. Il ciclo for successivo (che è già cablato perfettamente sul numero di giorni del mese), serve solo a costruire l'array dei giorni da passare alla JComboBox (o, se vuoi una cosa terra terra, solo per riempire il ComboBox), non per "calcolare il massimo giorno"... quello già ce l'ho al passaggio precedente.

    in questo caso giornoMax viene impostato sul massimo dei giorni del mese....

    ... che io ricavo con una sola chiamata a getMaximum() sull'oggetto Calendar... senza avere un ciclo for per ciascun giorno del mese.

    Beh.. dopo questa breve parentesi ... il mio problema non è questo ma bensì come poter aggiornare in fase di esecuzione il JComboBox dei giorni... in base alla scelta del mese e dell'anno scelto...
    Logicamente il pannello lo deve rendere visibile immediatamente alla sua creazione... e se un utente cambia il mese... beh... come (durante l'esecuzione) poter modificare il JComboBox del giorno???

    Aggiungi un ActionListener (o un ItemListener) ai JComboBox. Quando ricevi l'evento verifichi se la selezione è cambiata e, in tal caso, ricalcoli la JComboBox dei giorni.


    codice:
    comboBoxAnno.addItemListener( new ItemListener() {
       @Override
       public void itemStateChanged(ItemEvent ie) {
          verificaCambioAnno();
       }
    });
    
    comboBoxMese.addItemListener( new ItemListener() {
       @Override
       public void itemStateChanged(ItemEvent ie) {
          verificaCambioMese();
       }
    });
    
    ...
    
    private void verificaCambioAnno() {
       if ( l'anno è cambiato ) {
          ricalcolaGiorni();
       }
    }
    
    private void verificaCambioMese() {
       if ( il mese è cambiato ) {
          ricalcolaGiorni();
       }
    }
    
    ...
    
    private void ricalcolaGiorni() {
       int annoScelto = ...;
       int meseScelto = ...;   // Mese = numero - 1!!!
    
       // Mi posiziono al giorno 1 del mese/anno scelto
       GregorianCalendar gc = new GregorianCalendar(annoScelto, meseScelto, 1);
    
       // Ottengo il massimo giorno di quel mese
       int maxGiorno = gc.getMaximum( Calendar.DATE );
    
       // Svuoto la JComboBox dei giorni
       comboBoxGiorni.removeAllItems();
    
       // La riempio con i nuovi valori
       for(int i=0; i<maxGiorno; i++) comboBoxGiorni.addItem( String.valueOf(i+1) );
    }

    Ciao.
    Ultima modifica di LeleFT; 04-02-2014 a 10:35

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.