Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    87

    [Java] date in combobox

    Salve gente!

    Ho un problema idiota da cui però non riesco ad uscire elegantemente.
    Molti di voi avranno notato che i mesi non hanno tutti lo stesso numero di giorni.
    Ebbene ho tre combobox, uno per i giorni, uno per i mesi e l'ultimo per gli anni, vorrei che una volta selezionato febbraio in un combo sparissero i giorni di troppo e ricomparissero nei mesi che li hanno.
    Ho usato un sistema "manuale" tramite i metodi removeItem(Object) e insertItemAt(Object, index), ovviamente funziona ma è rozzo!
    Inoltre c'è un problema ulteriore, se è selezionato un giorno > 28 il cambio mese porta il giorno a 28, è vero che tramite if potrei rimettere a posto però... dai non voglio credere che non ci sia una soluzione più intelligente.
    Caspita quanto ho scritto...
    Ciao ciao!
    vlr

  2. #2
    Potresti postare un pò di codice alemno della parte interessata?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    87
    Originariamente inviato da unomichisiada
    Potresti postare un pò di codice alemno della parte interessata?
    Ecco il necessario:
    codice:
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class prova{
    	private final String[] MESI = {"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
    	private final String[] ANNI = {"2004", "2005", "2006", "2007", "2008", "2009", "2010"};
    	private String[] GIORNI = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"};
    
    	private JComboBox giorni, mesi, anni;
    
    	public static void main(String[] args){
    		new prova();
    	}
    
    	public prova(){
    		giorni = new JComboBox(GIORNI);
    		mesi = new JComboBox(MESI);
    		anni = new JComboBox(ANNI);
    		mesi.addItemListener(new ItemListener(){
    			public void itemStateChanged(ItemEvent e){
    			String press = e.getItem().toString();
    		if(press.equals(MESI[2])){
    		giorni.removeItem("31");
    		giorni.removeItem("30");
    		giorni.removeItem("29");
    	}
    	else
    	if(press.equals(MESI[1]) || press.equals(MESI[3]) || press.equals(MESI[5]) || press.equals(MESI[7]) || press.equals(MESI[8]) || press.equals(MESI[10]) || press.equals(MESI[12]))		{
    		giorni.removeItem("31");
    		giorni.removeItem("30");
    		giorni.removeItem("29");
    		giorni.insertItemAt("29", 29);
    		giorni.insertItemAt("30", 30);
    		giorni.insertItemAt("31", 31);
    	}
    	else
    	{
    		giorni.removeItem("31");
    		giorni.removeItem("30");
    		giorni.removeItem("29");
    		giorni.insertItemAt("29", 29);
    		giorni.insertItemAt("30", 30);
    	}
    }
    });
    
    		JPanel panel = new JPanel();
    		panel.add(giorni);
    		panel.add(mesi);
    		panel.add(anni);
    
    		JFrame jf = new JFrame();
    		jf.setContentPane(panel);
    		jf.pack();
    		jf.setVisible(true);
    	}
    }
    E manca anche il controllo per l'anno bisesto! VVoVe:
    Ciao ciao!
    vlr

  4. #4
    Io farei così:
    codice:
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class prova
    {
    	private final String[] MESI = {"Gennaio", "Febbraio", "Marzo", "Aprile", 
    	                               "Maggio", "Giugno", "Luglio", "Agosto", 
    	                               "Settembre", "Ottobre", "Novembre", "Dicembre"
    	                              };
    	private final String[] ANNI = {"2004", "2005", "2006", "2007", "2008", "2009", 
    	                               "2010"};
    	private String[] GIORNI = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 
    	                           "11", "12", "13", "14", "15", "16", "17", "18", "19", 
    	                           "20", "21", "22", "23", "24", "25", "26", "27", "28",
    	                           "29", "30", "31"
    	                          };
    
    	private JComboBox giorni, mesi, anni;
    
    	public static void main(String[] args)
    	{
    		new prova();
    	}
    
    	public prova()
    	{
    		giorni = new JComboBox(GIORNI);
    		mesi = new JComboBox(MESI);
    		anni = new JComboBox(ANNI);
    		mesi.addItemListener(new ItemListener()
    		{
    				public void itemStateChanged(ItemEvent e)
    				{
    					int selectedItem = mesi.getSelectedIndex() + 1;
    					int maxIndex;
    					giorni.removeAllItems();
    			
    					if(selectedItem < 8 && (selectedItem != 2))
    						maxIndex = (selectedItem % 2 == 0) ? 30 : 31;
    					else if(selectedItem == 2)
    						maxIndex = (anni.getSelectedIndex() % 4 == 0) ? 29 : 28;
    					else 
    						maxIndex = (selectedItem % 2 == 0) ? 31 : 30;
    					for(int i = 0 ; i < maxIndex ; i++ )
    						giorni.addItem(GIORNI[i]);
    				}
    			});
    
    		JPanel panel = new JPanel();
    		panel.add(giorni);
    		panel.add(mesi);
    		panel.add(anni);
    
    		JFrame jf = new JFrame();
    		jf.setContentPane(panel);
    		jf.pack();
    		jf.setVisible(true);
    	}
    }
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Tra l'altro così tieni cinto anche degli anni bisestili
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Ho apena notato un lieve problemino dovuto al fatto che l'evento che tu stai gestendo non viene generato se l'elemento selezionato nel combo dei mesi è lo stesso che c'era prima:se tu passi da un anno bisestile ad uno non bisestile il combo dei giorni rimane di 29 invece di passare a 28 quindi ti conviene intercettare questo stesso evento anche per il combo degli anni e fare in modo che all'interno del listener venga generato un evento ItemChanged per i mesi,così non rischi di avere anni bisestili di 28 giorni e viceversa.Ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Per sfizio ho risolto pure quello ed ho apportato la miglioria di lasciare sele zionato quello che c'era in caso di aggiornamento (prima veniva selezionato 1)
    codice:
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class prova
    {
    	private final String[] MESI = {"Gennaio", "Febbraio", "Marzo", "Aprile", 
    	                               "Maggio", "Giugno", "Luglio", "Agosto", 
    	                               "Settembre", "Ottobre", "Novembre", "Dicembre"
    	                              };
    	private final String[] ANNI = {"2004", "2005", "2006", "2007", "2008", "2009", 
    	                               "2010"};
    	private String[] GIORNI = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 
    	                           "11", "12", "13", "14", "15", "16", "17", "18", "19", 
    	                           "20", "21", "22", "23", "24", "25", "26", "27", "28",
    	                           "29", "30", "31"
    	                          };
    
    	private JComboBox giorni, mesi, anni;
    
    	public static void main(String[] args)
    	{
    		new prova();
    	}
    
    	public prova()
    	{
    		giorni = new JComboBox(GIORNI);
    		mesi = new JComboBox(MESI);
    		anni = new JComboBox(ANNI);
    		mesi.addItemListener(new ItemListener()
    		{
    				public void itemStateChanged(ItemEvent e)
    				{
    					int selectedItem = mesi.getSelectedIndex() + 1;
    					int maxIndex;
    					Object curItem = giorni.getSelectedItem();
    					giorni.removeAllItems();
    			
    					if(selectedItem < 8 && (selectedItem != 2))
    						maxIndex = (selectedItem % 2 == 0) ? 30 : 31;
    					else if(selectedItem == 2)
    						maxIndex = (anni.getSelectedIndex() % 4 == 0) ? 29 : 28;
    					else 
    						maxIndex = (selectedItem % 2 == 0) ? 31 : 30;
    					for(int i = 0 ; i < maxIndex ; i++ )
    						giorni.addItem(GIORNI[i]);
    					giorni.setSelectedItem(curItem);
    				}
    		});
    		anni.addItemListener(new ItemListener()
    		{
    				public void itemStateChanged(ItemEvent e)
    				{
    					String stringItem = e.getItem().toString();
    					if(mesi.getSelectedIndex() == 1)
    					{
    						Object curItem = giorni.getSelectedItem();
    						giorni.removeAllItems();
    						int maxIndex = (Integer.parseInt(stringItem) % 4 == 0) ? 29 : 28;
    						for(int i = 0 ; i < maxIndex ; i++ )
    							giorni.addItem(GIORNI[i]);
    						giorni.setSelectedItem(curItem);
    					}
    				}
    		});
    
    		JPanel panel = new JPanel();
    		panel.add(giorni);
    		panel.add(mesi);
    		panel.add(anni);
    
    		JFrame jf = new JFrame();
    		jf.setContentPane(panel);
    		jf.pack();
    		jf.setVisible(true);
    	}
    }
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    87
    Bravo!
    C'è un piccolo problemino (quando avendo selezionato un giono > 28 e si passa a febbraio si ritorna a 1) ma non m'interessa, va bene lo stesso. Grazie.
    Ciao ciao!
    vlr

  9. #9
    C'è un piccolo problemino (quando avendo selezionato un giono > 28 e si passa a febbraio si ritorna a 1) ma non m'interessa, va bene lo stesso. Grazie.
    Non è un problema secondo me. E' un comportamento logico,tu cosa faresti scusa?Al masimo potresti selezionare 28 ma mi sembra meno logico di selezionare 1 in quel caso.Ciao ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.