DateFormatter dd.MM.yyyy - vorhandene Methode?

membersound

Bekanntes Mitglied
Hallo,

Ich möchte ien JFormattedField so setzen, dass man nur ein gültiges Datum (dd.MM.yyyy) eintragen kann. Dafür nehme ich ein new MaskFormatter("##.##.####"); Damit kann ich zumindest regeln, dass man nur Zahlen eingeben kann.
Problem ist dabei aber, dass ich auch invalid Dates wie Monat 42 eingeben kann. Außerdem ist eine Datumeingabe wie 1.1.2011 problematisch, weil dann ja leere Felder genutzt werden. Die müssten dann noch in eine 0 umgewandelt werden.

Ich finde wahrscheinlich einfach die richtige Methode nicht, oder es gibt gar keine. Was ich mir kaum vorstellen kann, da sowas doch ständig gebraucht wird.
Gibt es dafür nicht schon was fertiges?

Danke
 

membersound

Bekanntes Mitglied
Und das soll mir jetzt was sagen?
Mit nem SimpleDateFormat als Parameter fürs TextFeld erreich ich ja nur, dass ich einen Fehler bekomme wenn das Datumsformat nicht dd.MM.yyyy ist. Aber darum gehts mir ja gar nicht.

Ich möchte ja ein vordefiniertes Feld haben, in das ich ausschließlich nur ein gültiges Datum eingeben kann. Also mit Überprüfung bereits bei der Eingabe. Mit dem genannten MaskFormatter erreich ich ja schonmal, dass dort nur Zahlen möglich sind. Aber ich müsste noch irgendwie ungültige Monate usw detecten können.
 
C

Camino

Gast
Also, ich hatte mir dafür mal einen InputVerifier zusammengebastelt:

Java:
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class InputDateVerifier
extends InputVerifier {

	// Datumsformat festlegen (MEDIUM: TT.MM.JJJJ)
	private DateFormat df = DateFormat.getDateInstance( DateFormat.MEDIUM );


	@Override
	public boolean verify( JComponent input ) {
		
		// Übergebene Komponente ist Textfeld
		JTextField tf = ( JTextField ) input;
		
		// Datumsstring aus Textfeld holen
		String datum = tf.getText();
		
		// Datumsstring an Punkten aufsplitten und in Array schreiben
		String[] splitArray = datum.split("\\.");

		// Leerzeichen entfernen
		splitArray[0] = splitArray[0].trim();
		splitArray[1] = splitArray[1].trim();
		splitArray[2] = splitArray[2].trim();
		
		// Falls Tag nur aus einer Zahl, führende Null anfügen
		if( splitArray[0].length()==1 ) {
			splitArray[0] = "0" + splitArray[0];
		}
		
		// Falls Monat nur aus einer Zahl, führende Null anfügen
		if( splitArray[1].length()==1 ) {
			splitArray[1] = "0" + splitArray[1];
		}
		
		// Datumsstring neu zusammensetzen und in Textfeld schreiben
		tf.setText( splitArray[0] + "." + splitArray[1] + "." + splitArray[2] );

		
		// Überprüfung: Jahrezahl hat weniger als 4 Zahlen
		if( splitArray[2].length()<4) {
			showMessageDialog( "Datum im Format TT.MM.JJJJ eingeben! (" + datum + ")" );
			return false;
		}
		
		
		// ***** Überprüfung des eingegebenen Geburtsdatum auf Alter
		
		int aktuellesJahr = new GregorianCalendar().get( Calendar.YEAR );
		int alter = aktuellesJahr - Integer.parseInt( splitArray[2] );

		if( alter < 18 || alter > 100 ) {
			showMessageDialog( "Alter nur zwischen 18 und 100 möglich! (Alter: " + alter + ")" );
			return false;			
		}

	
		
		// "Mild"-Modus ausschalten
		df.setLenient( false );
		
		// Parsen des Datums. Wenn ungültig, fliegt ParseException...
		try {
			df.parse( tf.getText() );
			return true;
		} catch ( ParseException e ) {
			showMessageDialog( "Kein gültiges Datum: " + datum );
			//e.printStackTrace();
			return false;
		}

	}
	
	// Dialog mit Fehlermeldung anzeigen
	private void showMessageDialog( String message ) {
		
		JOptionPane.showMessageDialog( null, message, "Fehler", JOptionPane.CANCEL_OPTION );
		
	}

}

Und den dann dem Textfeld zugewiesen:
Java:
...
// MaskFormatter für das Geburtsdatumstextfeld
		MaskFormatter mf = null;
		
		try {
			mf = new MaskFormatter( "##.##.####" );
		} catch ( ParseException e ) {
			e.printStackTrace();
		}
		
	tfGeburtsdatum = new JFormattedTextField( mf );

		
        // InputVerifier zuweisen (Überprüfung und Formatierung des Geburtsdatums)
	tfGeburtsdatum.setInputVerifier( new InputDateVerifier() );
...
 
C

Camino

Gast
Ich möchte ja ein vordefiniertes Feld haben, in das ich ausschließlich nur ein gültiges Datum eingeben kann. Also mit Überprüfung bereits bei der Eingabe.
Wenn du wirklich schon bei der Eingabe was überprüfen oder ausschliessen möchtest, musst du evtl. mit einem DocumentFilter arbeiten. Aber eigentlich müsste es ja mit dem InputVerifier ausreichen...
 

Ähnliche Java Themen

Neue Themen


Oben