Datums Eingabe

Saban

Erfahrenes Mitglied
Hallo,

ich hätt da mal ne Frage wenn ihr von nem Benutzer ein Datum abfragen wollt, welche Eingabe Variante würdet ihr wählen?
Ich habe an eine Combo Box gedacht, also drei Boxen der erste für den Tag, der zweite für den Monat und der letzte fürs Jahr aber ich hab keine Ahnung wie ich die Combo Boxen mit den jeweiligen Auswahl möglichkeiten befüllen soll, da ja je nach Monat 28, 30 oder 31 Tage auswählbar sein müssen.
Dann kam ich auf die Idee den Benutzer das Datum selbst eingeben zu lassen aber dann müsst ich so viele Prüfungen durchführen und das Datum auf ein bestimmtes Format formatieren das ich es halt in die einzelteile zerlegen kann :confused:

Wie würdet ihr vorgehen und wieso? bzw könnt ihr mir mit meinem Combo Box Problem helfen? :)

Danke!

MfG
Saban
 
Lass den Nutzer erst das Jahr, dann den Monat und dann den Tag auswählen indem du die Comboboxen einzeln freigibst: Also erst nur Jahr, dann den Monat und dann den Tag.

Mit dem GregorianCalendar kannst du dann abfragen wieviele Tage für einen Monat verfügbar sind.

Alternativ kannst du alles Auswählbar machen und wenn Jahr/Monat neu gewählt werden merkst du dir den gewählten Tag, aktualisierst die Combobox mit den verfügbaren Tagen, prüfst ob der zuletzt gewählte Tag verfügbar ist und setzt diesen auf den nähesten verfügbaren Wert.

Ansonsten lässt sich so ein Datenchooser in dem man unten den Tag und oben Monat und Jahr auswählen kann (wie in den meisten programmen) recht leicht selber machen.
 
Zuletzt bearbeitet:
Ich wuerd die die erste Variante von Zeja empfehlen. Hier musst du die Eingabe nicht mehr pruefen, da der Benutzer nur die Verfuegbaeren Tage oder Monate anwaehlen kann.
Noch eine Alternative waere es, wenn du 3 Textfelder machst, und dann mit TT-MM-JJ, aber das kommt fast aufs selbe raus, und du musst die Eingabe pruefen.
 
Der Meinung bin ich auch. Das Programm sollte immer so geschrieben sein des er Benutzer keine Fehler machen kann. Normalerweise muss man seine Eingabe auf Richtigkeit überprüfen, was bei einer Auswahl nicht mehr erforderlich ist, da du dir sicher sein kannst das seine Auswahl richtig ist. Du schränkst seine Eingabe ein und musst nur noch die Daten verarbeiten. Ich persönlich finde (Menschlicher Natur) finde eine Eingabe über die Tastatur am besten.
 
Zuletzt bearbeitet:
Morgen,

@MC Paul: So wie du hatte ich es ungefähr vor :)

@zeja: kannst du mir vllt nen Leitfaden geben wie ich des so hin bekomme wie du? Ich weiß z. B.

- bei den Jahren nicht wie ich sagen kann gehe vom 2007 bis ins endlose ohne ne endlos Schleife einzubauen
- oder wie ich die Buttons dem jeweiligen Wochentag zuordne

Danke für die Posts!

MfG
Saban
 
Zuletzt bearbeitet:
Ich hab mir nen GregorianCalendar Objekt erstellt (leerer Konstruktor = aktuelles Datum).

Allgemein kann man aus dem Objekt dann mit get die Werte abfragen und mit set Werte setzen.

So fragt man z.B. das Jahr ab:
Java:
calendar.get(Calendar.YEAR);

Für den Monat kann man das ganze auch für die aktuelle Sprache formatieren lassen:
Java:
cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

Die Buttons zum Blättern in Jahr und Monat arbeiten dann immer auf dem aktuellen Calendar und fügen mit add jeweils 1 hinzu oder ziehen -1 ab. Danach wird immer die update Methode aufgerufen. Diese liest dann Jahr und Monat aus und aktualisiert die Textfelder. Dann werden zusätzlich im unteren Panel alle Buttons gelöscht und vom Calendar mit
Java:
cal.getActualMaximum(Calendar.DAY_OF_MONTH);
die Anzahl der Tage im Monat abgefragt.

Mit
Java:
cal.getFirstDayOfWeek();
Kann man abfragen welcher Wochentag denn der erste ist.

Dann kann man mit clone() den Calendar einmal Klonen um ihn in einer Schleife zu benutzen. Dort kann man ganz einfach über die Anzahl der Tage des Monats eine Schleife machen und die Tage als Buttons hinzufügen. Dem Button kannst du mit setActionCommand einen Wert mitgeben der z.B. den Wochentag oder auch das ganze Datum enthält. Den Buttons kann dann immer der selbe ActionListener übergeben werden und in diesem Wertet man dann das Kommando aus.
 
Hi,

ich wollte mal wissen ob der Ansatz von mir in die richtige Richtung geht und hätte dann noch ne Frage. Hier erst mal mein Code:
Java:
import java.awt.Container;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Kalender {
	
	public GregorianCalendar calendar = new GregorianCalendar();
	public static JTextField tf_jahr = new JTextField();
	public static JTextField tf_monat = new JTextField();
	public static int w_zähler = 1;
	public static int pos_x = 0;
	public static int pos_y = 0;
	public static int bt_breite = 60;
	
	//Getter fürs Jahr
	public int getYear(){
		return calendar.get(Calendar.YEAR);
	}
	
	//Getter des Monats mit Sprach-Formatierung
	public String getMonth(){
		return calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()); 
	}
	
	//Getter für die Tage des Monats
	public int getDays(){
		return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
	}
	
	//Getter für den ersten Tag des Monats
	public int getFirstDay(){
		return calendar.getFirstDayOfWeek(); 
	}
	
	//Getter für die Woche im Jahr
	public int getWeek(){
		return calendar.get(Calendar.WEEK_OF_YEAR);
	}
	
	public static void main(String [] args){
		Kalender kal = new Kalender();
		
		JFrame frame = new JFrame("Kalender");
		
		tf_jahr.setEditable(false);
		tf_jahr.setHorizontalAlignment(JTextField.CENTER);
		tf_jahr.setText(String.valueOf(kal.getYear()));
		
		tf_monat.setEditable(false);
		tf_monat.setHorizontalAlignment(JTextField.CENTER);
		tf_monat.setText(kal.getMonth());
		
		//Buttons zum aussuchen des Jahres
		JButton j_weiter = new JButton("-->");
		JButton j_zurück = new JButton("<--");
		
		//Buttons zum aussuchen des Monats
		JButton m_weiter = new JButton("-->");
		JButton m_zurück = new JButton("<--");
		
		Container c = frame.getContentPane();
		c.setLayout(null);
		
		j_zurück.setBounds		( 10,  10,  60, 20);
		tf_jahr.setBounds		( 80,  10,  80, 20);
		j_weiter.setBounds		(170,  10,  60, 20);
		
		m_zurück.setBounds		(300,  10,  60, 20);
		tf_monat.setBounds		(370,  10,  80, 20);
		m_weiter.setBounds		(460,  10,  60, 20);
		
		JButton bt_tag[] = new JButton[31];
		
		pos_x = 90;
		pos_y = 80;
		
		//Buttons für die Tage des Monats
		for(int tage = 0; tage < kal.getDays(); tage++){
			bt_tag[tage] = new JButton();
			bt_tag[tage].setText(String.valueOf(tage+1));
			bt_tag[tage].setBounds(pos_x,  pos_y,  bt_breite, 50);
			c.add(bt_tag[tage]);
			pos_x += 65;
						
			if(tage % 7 == 6){
				w_zähler += 1;
				pos_y += 55;
				pos_x = 90;
			}
		}
		
		JButton bt_woche[] = new JButton[5];
		
		pos_x = 10;
		pos_y = 80;
		
		//Buttons für die Woche des Jahres
		for(int wochen = 0; wochen < w_zähler; wochen++){
			bt_woche[wochen] = new JButton();
			bt_woche[wochen].setText(String.valueOf("#" + kal.getWeek()));
			bt_woche[wochen].setBounds(pos_x,  pos_y, bt_breite, 50);
			c.add(bt_woche[wochen]);
			pos_y += 55;
		}
		
		c.add(j_zurück); c.add(j_weiter); c.add(tf_jahr);
		c.add(m_zurück); c.add(m_weiter); c.add(tf_monat);
		
		frame.setSize(550, 500);
		frame.setVisible(true);
	}
}

und nun zu meiner Frage ich würde in meiner init() gerne meine Getter benutzen aber ich kriege das irgendwie nicht hin :confused: in meiner main() klappt es ja auch :(... Kann es daran liegen das ich erst ein Objekt erzeugen muss und dann auf die Getter zugreifen kann? Vielleicht sollte ich noch dazu sagen das ich erst seit ca. 2 Wochen mich mit der Objekt Orientierung beschäftige...

Danke im voraus!

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück