So mein Poblem ist, dass ich einen Date/Time-Picker schreibe.
Leider habe ich aktuell ein Problem mit dem GregorianCalendar:
Jedesmal wenn man mit eine JComboBox das Jahr oder den Monat ändert,
soll die anzahl der Tage entsprechend angepasst werden.
Das Problem dabei ist, dass der GregorianCalendar immer als Anzahl der Tage des Monats 31
zurückgibt.
Ebenfals problematisch ist, dass die erste Änderung irgendwie nicht bei dem GregorianCalendar
ankommt....
Folgender Code:
erzeugt folgende Ausgabe:
Leider habe ich aktuell ein Problem mit dem GregorianCalendar:
Jedesmal wenn man mit eine JComboBox das Jahr oder den Monat ändert,
soll die anzahl der Tage entsprechend angepasst werden.
Das Problem dabei ist, dass der GregorianCalendar immer als Anzahl der Tage des Monats 31
zurückgibt.
Ebenfals problematisch ist, dass die erste Änderung irgendwie nicht bei dem GregorianCalendar
ankommt....
Folgender Code:
Java:
public class DateTimeChooser extends JFrame implements ActionListener, ItemListener{
JComboBox year;
JComboBox month;
JComboBox day;
JComboBox minute;
JComboBox hour;
Container dateObjects=new Container();
Container timeObjects=new Container();
GregorianCalendar gc=new GregorianCalendar();
public DateTimeChooser(){
super("Choose date and time");
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS));
dateObjects.setLayout(new FlowLayout());
this.setSize(300,300);
this.setLocation(300,300);
int thisYear=gc.get(gc.YEAR);
String[] years={Integer.toString(thisYear),
Integer.toString(thisYear+1),
Integer.toString(thisYear+2),
Integer.toString(thisYear+3),
Integer.toString(thisYear+4),
Integer.toString(thisYear+5)};
String[] months={"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
year = new JComboBox(years);
year.addItemListener(this);
month = new JComboBox(months);
month.setSelectedIndex(gc.get(gc.MONTH));
month.addItemListener(this);
day=new JComboBox();
dateObjects.add(year);
dateObjects.add(month);
dateObjects.add(day);
prepareDay();
//for(int i=0;i<59;)
this.add(dateObjects);
this.setVisible(true);
}
public void itemStateChanged(ItemEvent e){
System.out.println(e.getItem());
if(e.getStateChange()==1){
prepareDay();
day.repaint();
dateObjects.repaint();
this.repaint();
}
}
private void prepareDay(){
gc.set(gc.YEAR,Integer.parseInt((String)year.getSelectedItem()));
gc.set(gc.MONTH,month.getSelectedIndex());
System.out.println("set month to "+month.getSelectedIndex()+" and it is now "+gc.get(gc.MONTH));
int tage = gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
System.out.println("prepareDay "+tage);
day.removeAllItems();
for(Integer dayItems=1;
dayItems<=tage;
dayItems++)
day.addItem(dayItems);
}
public void actionPerformed(ActionEvent e){
}
}
erzeugt folgende Ausgabe:
Code:
set month to 2 and it is now 2
prepareDay 31
März
Februar
set month to 1 and it is now 2
prepareDay 31
Februar
Januar
set month to 0 and it is now 0
prepareDay 31
Januar
Februar
set month to 1 and it is now 1
prepareDay 28