Nur Zahlen oder ein leeres JFormattedTextField zulassen

Milo

Bekanntes Mitglied
Hi,

ich habe ein JFormattedTextField, welches Nutzereingaben entgegen nimmt, und nur Ziffern oder eine Leere Eingabe erlauben soll.

Java:
NumberFormat doubleFormat = NumberFormat.getNumberInstance(Locale.ENGLISH);
doubleFormat.setMinimumFractionDigits(3);
doubleFormat.setMaximumFractionDigits(7);
doubleFormat.setMinimumIntegerDigits(1);
doubleFormat.setGroupingUsed(false);

JFormattedTextField jft = new JFormattedTextField(doubleFormat);
jft.setInputVerifier(new NumberValueFormattedTextFieldVerifier(true));
jft.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
jft.setHorizontalAlignment(JFormattedTextField.RIGHT);
jft.setColumns(12);

Das nur Double-Werte angenommen und wie gewünscht angezeigt werden, funktioniert soweit. Das Problem ist, dass wenn erst einmal in einem Feld etwas drin steht, dieses Feld nicht mehr geleert werden kann. Wie erreiche ich, dass auch ein leeres Feld zulässig ist und ich in diesem Fall eben null oder einen leeren String beim Aufruf von getValue() zurückbekomme?

Vielen Dank
Micha

Der Vollständigkeit halber noch die Klasse NumberValueFormattedTextFieldVerifier

Java:
import java.awt.Color;

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

public class NumberValueFormattedTextFieldVerifier extends InputVerifier {
	private boolean allowEmptyValues = false;
	public NumberValueFormattedTextFieldVerifier(boolean allowEmptyValues) {
		this.allowEmptyValues = allowEmptyValues;
	}
	
	@Override
	public boolean verify(JComponent comp) {
		if (comp instanceof JTextField) {
			JTextField textField = (JTextField) comp;
			String content = textField.getText();
			return content != null && ((content.trim().isEmpty() && this.allowEmptyValues) || content.trim().matches("^(\\d|-)?\\d*(\\.\\d*)?$"));
		}
		return false;
	}
	
	@Override
	public boolean shouldYieldFocus(JComponent comp) {
		if (!this.verify(comp)) {
			comp.setForeground(Color.RED);
			return false;
		}
		else {
			comp.setForeground(Color.BLACK);
			return true;
		}
	}
}
 
Zuletzt bearbeitet:
Sollte das:
Java:
 return content != null
normal nicht so sein:
Java:
return !content.isEmpty()
oder
Java:
return !content.equals(null)
 
Hi,

das Problem scheint eher am Aufruf von

Java:
JFormattedTextField jft = new JFormattedTextField(doubleFormat);

zu liegen, da
Java:
JFormattedTextField jft = new JFormattedTextField();

funktioniert. Den NumberValueFormattedTextFieldVerifier würde ich daher im Moment ausschließen.

Ansonsten
Java:
content.isEmpty()
kann nur funktionieren, wenn
Java:
content != null
ist ;-) Der Verifier liefert aber die richtigen Ergebnisse (true bzw. false), soweit ich das sehe, sodass ich eher auf das NumberFormat tippe.

Schöne Grüße
Micha
 
Muss es denn ein JFormattedTextField sein?
Ich mag das Teil nicht und bisher hat ein simpler DocumentListener auf einem normalen JTextField zumind. bei mir immer zuverlässige Lösungen geschaffen, was ich vom JFTF nicht behaupten kann.

Gruß Vanny
 
Hi,

Muss es denn ein JFormattedTextField sein?
Nein, aber eigentlich ist es genau dafür gedacht, oder?

Ich habe es aber hinbekommen nach dem ich diesen Eintrag fand:

Java:
JFormattedTextField jft = new JFormattedTextField(format) {
	private static final long serialVersionUID = 1664905922027529040L;
	@Override  
	protected void processFocusEvent(final FocusEvent e) {  
		if (e.isTemporary())  
			return;  
	  
		if (e.getID() == FocusEvent.FOCUS_LOST && (getText() == null || getText().isEmpty())) 
			setValue(null);  
				
		super.processFocusEvent(e);  
	}
};

Schöne Grüße
Micha
 

Zurück
Oben