Nummernfeld programmieren

Ich brauche für mein Programm ein paar Zahlenfelder, sprich es dürfen nur gültige Integer eingegeben werden, andere Zeichen sollen gleich bei der Eingabe abgeblockt werden.

Jetzt habe ich versucht das so zu lösen:```import java.awt.Component;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JTextField;

public class JNumberField extends JTextField {
public JNumberField() {
this.addKeyListener( new KeyListener() {
private String recovery = null;
private JNumberField jnf = null;

		public void keyPressed( KeyEvent e ) {
			if ( this.jnf == null )
				this.jnf = (JNumberField) e.getComponent();
			this.recovery = this.jnf.getText();
		}

		public void keyReleased( KeyEvent e ) {
			try {
				Integer.parseInt( jnf.getText() );
			} catch ( NumberFormatException nfe ) {
				this.jnf.setText( this.recovery );
			}
		}

		public void keyTyped( KeyEvent e ) {}
	});
}

}```

Der Haken an der Sache ist, dass man 1. sieht wie das Feld wieder zurückgesetzt wird und 2. wird das Feld nicht korrekt zurückgesetzt wenn man die Zeichen zu schnell eingibt! Gibt es da keine komfortablere Lösung? Ich hätte schon mal in der Java-API etwas nachgelesen, finde aber nichts was mir in diesem Fall helfen könnte -_-

sieh dir mal JFormattedTextField an, dem kannst du direkt sagen was es annehmen soll, solltest du dein Vorhaben weiter machen wollen solltest du keinen Keylistener nehmen sondern über das Document arbeiten das sollte glaube sauberer sein

Ich habs jetzt so gelöst: ```import java.text.ParseException;
import javax.swing.JFormattedTextField;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;

public class JNumberField extends JFormattedTextField {
public JNumberField() {
try {
this.setFormatterFactory( new DefaultFormatterFactory( new MaskFormatter("###") ) );
} catch (ParseException e) {
this.setText("");
}
}
}```

Vielen Dank! :slight_smile:

PS: Was meintest du mit Document ?

wie die JTable besitzt auch ein JTextField ein Model, hier heißt es Document. Das kannst du mit getDocument bekommen und da direkt die Daten ändern.

Btw, thE_29 hat im Byte-Welt-Wiki ein Special über JTextField Dokumentarten erstellt: Byte-Welt-Wiki - JTextField - Dokumentarten
falls du einmal etwas mehr spezielles brauchst :wink:

@Andre Uhres
Vielen Dank! Ich das mit dem MaskFormatter klappte letztendlich nicht so gut. Ich hab mich an die Lösung von thE_29 gehalten:

import javax.swing.text.*;

public class JNumberField extends JFormattedTextField {
	public JNumberField() {
		this.setDocument( new PlainDocument() {
			public void insertString( int offset, String s, AttributeSet attributeSet )  {
				try {
					Integer.parseInt( s );
					super.insertString( offset, s, attributeSet );
				} catch ( Exception e ) {}
			}
		} );
	}
}```