JFormattedTextField erst Verlassen, wenn Eingabe korrekt

Status
Nicht offen für weitere Antworten.

nuely

Mitglied
Nachdem man mich ein wenig über das JFormattedTextField aufgeklärt hat und ich mich damit beschäftigt habe, stehe ich jetzt vor dem Problem, wie ich ein Feld erstelle in welches nur Zahlen eingegeben werden dürfen. Die Variante mit dem MaskFormatter (siehe unten) schreibt ja automatisch auch vor, dass genau so viele Nummern eingegeben werden müssen, wie im Formatter stehen. Beim zweiten Eingabefeld unten (Gewicht) kann aber ja die Anzahl der Nummern variieren. Dort habe ich jetzt das NumberFormat im Einsatz. Was ich aber eigentlich möchte ist, dass bei einer Fehleingabe des Benutzers das Feld gar nicht erst verlassen werden kann. Ich hatte dort wieder auf den PropertyChangeListener zurückgegriffen, weiß aber nicht ob der Lösungsweg gut ist oder wie ich das lösen kann.

Code:
import javax.swing.SwingUtilities;
import java.awt.GridBagConstraints;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import java.text.ParseException;

import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.text.MaskFormatter;

import java.awt.GridBagLayout;
import javax.swing.JLabel;

public class TextFieldTest extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JFormattedTextField nummer;
	private JFormattedTextField gewicht;
	private JLabel gewichtLabel = null;
	private JLabel nummerLabel = null;
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				TextFieldTest thisClass = new TextFieldTest();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	public TextFieldTest() {
		super();
		initialize();
	}

	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			
			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
			gridBagConstraints2.gridx = 1;
			gridBagConstraints2.gridy = 0;
			nummerLabel = new JLabel();
			nummerLabel.setText("Nummer");
			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
			gridBagConstraints11.gridx = 1;
			gridBagConstraints11.gridy = 1;
			gewichtLabel = new JLabel();
			gewichtLabel.setText("Gewicht");
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.BOTH;
			gridBagConstraints1.gridy = 1;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.gridx = 2;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.fill = GridBagConstraints.BOTH;
			gridBagConstraints.gridy = 0;
			gridBagConstraints.weightx = 1.0;
			gridBagConstraints.gridx = 2;
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(nummerTextField(), gridBagConstraints);
			jContentPane.add(gewichtTextField(), gridBagConstraints1);
			jContentPane.add(gewichtLabel, gridBagConstraints11);
			jContentPane.add(nummerLabel, gridBagConstraints2);
		}
		return jContentPane;
	}
	
	private JFormattedTextField nummerTextField() {
		try {
			nummer = new JFormattedTextField(new MaskFormatter("#####"));
			nummer.setValue(null);
			nummer.addPropertyChangeListener(new Nummer());
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return nummer;
	}
	
	private JFormattedTextField gewichtTextField() {
		NumberFormat nummerneingabe=NumberFormat.getNumberInstance();
		nummerneingabe.setGroupingUsed(false);
		nummerneingabe.setMinimumIntegerDigits(1);
		nummerneingabe.setMaximumIntegerDigits(5);
		gewicht = new JFormattedTextField(nummerneingabe);
		gewicht.setValue(null);
		gewicht.addPropertyChangeListener(new Gewicht());
		return gewicht;
	}
	
	class Gewicht implements PropertyChangeListener
	{
		public void propertyChange(PropertyChangeEvent e)
		{
			System.out.println("Value: "+gewicht.getValue());
			System.out.println("Text: "+gewicht.getText());
			if(gewicht.getValue()!=null)
			{
				System.out.println("ein wert wurde eingegeben");
				//Prüfung, ob Eingabe i.O., sonst zurück ins Feld springen.
				
			}
			else
			{
				//Mit requestFocus komme ich nicht mehr ohne Eingabe aus dem Feld raus.
				//gewicht.requestFocus();
				//gewicht.selectAll();
			}
		}	
	}
	
	class Nummer implements PropertyChangeListener
	{
		public void propertyChange(PropertyChangeEvent e)
		{
			System.out.println("Value: "+nummer.getValue());
			System.out.println("Text: "+nummer.getText());
			if(nummer.getValue()!=null)
			{
				System.out.println("Ein Wert wurde eingegeben");
			}
		}
	}
}
 

Verjigorm

Top Contributor
Focuslistener mit focusLost()

dort fragst du ab, ob die Eingabe valid ist
wenn nicht, dann setze den Focus wieder auf das FormattedTextfield

Aber vorsicht, das kann böse sein ;)
Ein Programmfehler könnte verhindern, dass man aus der "Schleife" wieder rauskommt.
Ungeduldige User kann das auch ziemlich fertigmachen, falls man einfach die richtige "Form" nicht findet, um aus dem Feld wieder rauszukommen
 

nuely

Mitglied
Das ist auf jeden Fall schon mal eleganter. Funktioniert aber nicht richtig. Value wird leider erst gesetzt nachdem der FocusListener aufgerufen wird. Wenn ich ne Zahl eingebe komme ich in diesem Beispiel erst nach zweimal Tab aus dem Feld raus. Ich könnte jetzt zwar Text abfragen, aber das wird auch gesetzt wenn ich Buchstaben eingebe. Dann bräuchte ich kein FormattedTextField.

Code:
import javax.swing.SwingUtilities;
import java.awt.GridBagConstraints;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import java.text.ParseException;

import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.text.MaskFormatter;

import java.awt.GridBagLayout;
import javax.swing.JLabel;

public class TextFieldTest extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JFormattedTextField nummer;
	private JFormattedTextField gewicht;
	private JLabel gewichtLabel = null;
	private JLabel nummerLabel = null;
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				TextFieldTest thisClass = new TextFieldTest();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	public TextFieldTest() {
		super();
		initialize();
	}

	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			
			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
			gridBagConstraints2.gridx = 1;
			gridBagConstraints2.gridy = 0;
			nummerLabel = new JLabel();
			nummerLabel.setText("Nummer");
			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
			gridBagConstraints11.gridx = 1;
			gridBagConstraints11.gridy = 1;
			gewichtLabel = new JLabel();
			gewichtLabel.setText("Gewicht");
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.BOTH;
			gridBagConstraints1.gridy = 1;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.gridx = 2;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.fill = GridBagConstraints.BOTH;
			gridBagConstraints.gridy = 0;
			gridBagConstraints.weightx = 1.0;
			gridBagConstraints.gridx = 2;
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(nummerTextField(), gridBagConstraints);
			jContentPane.add(gewichtTextField(), gridBagConstraints1);
			jContentPane.add(gewichtLabel, gridBagConstraints11);
			jContentPane.add(nummerLabel, gridBagConstraints2);
		}
		return jContentPane;
	}
	
	private JFormattedTextField nummerTextField() {
		try {
			nummer = new JFormattedTextField(new MaskFormatter("#####"));
			nummer.setValue(null);
			nummer.addPropertyChangeListener(new Nummer());
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return nummer;
	}
	
	private JFormattedTextField gewichtTextField() {
		NumberFormat nummerneingabe=NumberFormat.getNumberInstance();
		nummerneingabe.setGroupingUsed(false);
		nummerneingabe.setMinimumIntegerDigits(1);
		nummerneingabe.setMaximumIntegerDigits(5);
		gewicht = new JFormattedTextField(nummerneingabe);
		gewicht.setValue(null);
		//gewicht.addPropertyChangeListener(new Gewicht());
		gewicht.addFocusListener(new java.awt.event.FocusListener() {
			public void focusLost(java.awt.event.FocusEvent e) {
				
				System.out.println("Value: "+gewicht.getValue());
				System.out.println("Text: "+gewicht.getText());
				if(gewicht.getValue()!=null)
				{
					//Zahl eingegeben --> weiter
				}
				else
				{
					//keine Zahl eingegeben --> nochmal versuchen
					gewicht.requestFocus();
					gewicht.selectAll();
				}
			}
			public void focusGained(java.awt.event.FocusEvent e) {
			}
		});
		return gewicht;
	}
	
	class Gewicht implements PropertyChangeListener
	{
		public void propertyChange(PropertyChangeEvent e)
		{
			System.out.println("Value: "+gewicht.getValue());
			System.out.println("Text: "+gewicht.getText());
			if(gewicht.getValue()!=null)
			{
				System.out.println("ein wert wurde eingegeben");
				//Prüfung, ob Eingabe i.O., sonst zurück ins Feld springen.
				
			}
			else
			{
				//Mit requestFocus komme ich nicht mehr ohne Eingabe aus dem Feld raus.
				//gewicht.requestFocus();
				//gewicht.selectAll();
			}
		}	
	}
	
	class Nummer implements PropertyChangeListener
	{
		public void propertyChange(PropertyChangeEvent e)
		{
//			System.out.println("Value: "+nummer.getValue());
//			System.out.println("Text: "+nummer.getText());
			if(nummer.getValue()!=null)
			{
				System.out.println("Ein Wert wurde eingegeben");
			}
		}
	}
}
 

Verjigorm

Top Contributor
Du brauchst doch im focusLost() nur sowas:

Code:
				String text = gewicht.getText();
				System.out.println(text);
				if(text.length() > 0)
				{
					if(!text.equals("66666"))
						gewicht.grabFocus();
				}
 

nuely

Mitglied
ja klar geht das. Nur wie gesagt, dann brauch ich kein FormattedTextField. Das geht auch mit nem normalen. Mein Gedanke war ja den Vorteil des FormattedTextField zu nutzen, welches man von Anfang an einschränken kann.
 

André Uhres

Top Contributor
Zum Einschränken der Anzahl von Zeichen, die der Benutzer in einem
Textfeld eingeben darf, können wir unser eigenes Document setzen:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTextField.html.
Ferner können wir die Methode JComponent#setInputVerifier(..) benutzen,
um unseren eigenen InputVerifier an das Textfeld zu hängen.
Die Klasse InputVerifier stellt sicher, daß der Text, den der Benutzer eigegeben hat,
gültig ist, bevor dem Benutzer erlaubt wird, das Textfeld zu verlassen:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/InputVerifier.html.

Beispiel: IntegerField.java
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
S JFormattedTextField dezimal variabler Länge AWT, Swing, JavaFX & SWT 12
Ghostman1711 Java JFormattedTextfield MaskFormatter ohne Leerzeichen AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
M European Article Number (EAN) in JFormattedTextfield AWT, Swing, JavaFX & SWT 3
L JFormattedTextField AWT, Swing, JavaFX & SWT 3
B Swing JFormattedTextField AWT, Swing, JavaFX & SWT 4
Y JFormattedTextfield - Aktualisierung und Beschränkung AWT, Swing, JavaFX & SWT 4
V Swing Nullpointer Exception bei JFormattedTextField AWT, Swing, JavaFX & SWT 4
S Swing JFormattedTextField - bei nicht korrekter Eingabe Inhalt überschreiben AWT, Swing, JavaFX & SWT 5
S Swing JFormattedTextfield markiert nicht gesamten Inhalt AWT, Swing, JavaFX & SWT 4
C Swing Button in Textfeld (JFormattedTextField) AWT, Swing, JavaFX & SWT 7
A jformattedtextfield unsichtbar und wieder sichtbar machen AWT, Swing, JavaFX & SWT 13
C Swing JFormattedTextField + Eurobetrag AWT, Swing, JavaFX & SWT 2
E Problem mit MaskFormatter und JFormattedTextField AWT, Swing, JavaFX & SWT 3
A EventListener für JFormattedTextField AWT, Swing, JavaFX & SWT 6
B Swing Betrag mit Komma aus jformattedtextfield auslesen. AWT, Swing, JavaFX & SWT 2
E Swing JFormattedTextField Live Validierung AWT, Swing, JavaFX & SWT 4
C Swing Default Werte für JFormattedTextField und Eingaben zurücksetzen AWT, Swing, JavaFX & SWT 5
G JFormattedTextField und DefaultButton AWT, Swing, JavaFX & SWT 6
B Swing JFormattedTextField auf mehreren JPanels in einer JTabbedPane AWT, Swing, JavaFX & SWT 3
G JFormattedTextField values AWT, Swing, JavaFX & SWT 8
R JFormattedTextField AWT, Swing, JavaFX & SWT 8
D Eingabemaske im JFormattedTextField ändern AWT, Swing, JavaFX & SWT 3
D JFormattedTextfield um Grafik erweitern AWT, Swing, JavaFX & SWT 15
G JFormattedTextField lässt sich nicht mehr leeren AWT, Swing, JavaFX & SWT 4
N PropertyChangeListener an JFormattedTextField AWT, Swing, JavaFX & SWT 7
D Problem mit JFormattedTextField AWT, Swing, JavaFX & SWT 6
A Problem mit JFormattedTextField auslesen AWT, Swing, JavaFX & SWT 11
S JFormattedTextField und maximal 3 Stellen. AWT, Swing, JavaFX & SWT 11
M JFormattedTextField und Null-Werte AWT, Swing, JavaFX & SWT 4
E JformattedTextField, Dialog und weitere Kleinigkeiten . AWT, Swing, JavaFX & SWT 2
E Problem mit Validierende Eingabefeldern JFormattedTextField AWT, Swing, JavaFX & SWT 8
B JFormattedTextField mit DecimalFormat in ein Double AWT, Swing, JavaFX & SWT 11
C JFormattedTextField - nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 3
H JFormattedTextField - Einen Preis eingeben lassen AWT, Swing, JavaFX & SWT 2
B Zeichen werden im JFormattedTextField überschrieben AWT, Swing, JavaFX & SWT 3
H JFormattedTextField AWT, Swing, JavaFX & SWT 4
W IP-Adresse mit JFormattedTextField AWT, Swing, JavaFX & SWT 5
F JFormattedTextField formatieren AWT, Swing, JavaFX & SWT 7
J [JFormattedTextField] Nur Zahlen eingebbar AWT, Swing, JavaFX & SWT 3
S [JFormattedTextField] Ja wie denn nun? AWT, Swing, JavaFX & SWT 2
G Datumseingabe mit JFormattedTextField AWT, Swing, JavaFX & SWT 4
B Wert bei JFormattedTextField automatisch aktualisieren AWT, Swing, JavaFX & SWT 2
H Frage zu JFormattedTextField AWT, Swing, JavaFX & SWT 2
G Problem mit JFormattedTextField AWT, Swing, JavaFX & SWT 3
M Datumseingabe in ein JFormattedTextfield AWT, Swing, JavaFX & SWT 2
F Problem mit JFormattedTextField AWT, Swing, JavaFX & SWT 4
A JFormattedTextField - vertical misalignment problems... AWT, Swing, JavaFX & SWT 12
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
K Swing Buttons erst blinken lassen und dann abfragen, ob sie gedrückt worden sind AWT, Swing, JavaFX & SWT 2
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
U ToolTip Größenänderung, passt sich erst beim zweiten Mal an AWT, Swing, JavaFX & SWT 6
T Eingabefelder gefüllt erst dann Button klickbar AWT, Swing, JavaFX & SWT 6
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
J 2D-Grafik JPanel wird erst 1-2sek nach start des JFrames angezeigt AWT, Swing, JavaFX & SWT 3
M Anzeige updatet sich erst am Ende des Programms AWT, Swing, JavaFX & SWT 3
J resize - Label bleibt erst schwarz AWT, Swing, JavaFX & SWT 4
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
P ... zeichnet erst im zweiten Anlauf AWT, Swing, JavaFX & SWT 10
L Swing JPanel erscheint erst beim Vergrößern AWT, Swing, JavaFX & SWT 4
R Fensterinhalt erscheint erst, wenn das Fenster verändert wird AWT, Swing, JavaFX & SWT 7
0 JFrame zeigt Inhalt erst nach vergrößern an AWT, Swing, JavaFX & SWT 3
G Components erscheinen erst bei Änderung des Frames AWT, Swing, JavaFX & SWT 3
xehpuk Swing Erst Components, dann Container zeichnen AWT, Swing, JavaFX & SWT 2
R JPanel wird erst neu gezeichnet nach erneuter auswahl AWT, Swing, JavaFX & SWT 8
F Swing Auf JComboBox-Event erst NACH Auswahl reagieren AWT, Swing, JavaFX & SWT 8
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
M LayoutManager Erst layouten, dann zeichnen AWT, Swing, JavaFX & SWT 3
Z JPanel wird erst durch aufziehen des Fensters sichtbar AWT, Swing, JavaFX & SWT 3
F setIcon wird erst nach der methode ausgeführt AWT, Swing, JavaFX & SWT 4
T JTable erst nach Änderung der Spaltenbreite neu zeichnen AWT, Swing, JavaFX & SWT 10
T neuer JFrame öffnet sich erst wenn Methode die dahinerliegt abgeschlossen ist. BUG? AWT, Swing, JavaFX & SWT 4
I Swing Bild wird erst bei manueller Änderung der Fenstergrösse gezeichnet AWT, Swing, JavaFX & SWT 3
F Swing Button reagiert erst beim mehrmaligen Anklicken AWT, Swing, JavaFX & SWT 6
S Swing PopUp oeffnet sich nach der Methode, die erst nach Fensteraufruf gestartet wird AWT, Swing, JavaFX & SWT 3
R JButton -> erst sichtbar nach rollover AWT, Swing, JavaFX & SWT 9
F JButton reagiert erst beim 2 klick AWT, Swing, JavaFX & SWT 8
T JLabel.setText() funktioniert erst nach repaint() etc.? AWT, Swing, JavaFX & SWT 4
S JComboBox in JTable wird erst nach klick angezeigt AWT, Swing, JavaFX & SWT 2
G Textarea zeigt Text erst am Schluss an AWT, Swing, JavaFX & SWT 2
T JButton wird erst bei mouseover sichtbar AWT, Swing, JavaFX & SWT 2
A Buttons erscheinen erst beim rüberfahren AWT, Swing, JavaFX & SWT 13
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
Z Buttons erscheinen erst wenn man mit der Maus drüber geht AWT, Swing, JavaFX & SWT 7
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
A JTree wird erst nach Klick aktualisiert AWT, Swing, JavaFX & SWT 2
X JTable "geht" erst beim 2.Klick AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben