# Nur Zahlen oder ein leeres JFormattedTextField zulassen



## Milo (14. Okt 2012)

Hi,

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


```
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


```
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;
		}
	}
}
```


----------



## MrClave (14. Okt 2012)

Sollte das:

```
return content != null
```
normal nicht so sein:

```
return !content.isEmpty()
```
oder

```
return !content.equals(null)
```


----------



## Milo (14. Okt 2012)

Hi,

das Problem scheint eher am Aufruf von 


```
JFormattedTextField jft = new JFormattedTextField(doubleFormat);
```

zu liegen, da 
	
	
	
	





```
JFormattedTextField jft = new JFormattedTextField();
```

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

Ansonsten 
	
	
	
	





```
content.isEmpty()
```
 kann nur funktionieren, wenn 
	
	
	
	





```
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


----------



## vanny (14. Okt 2012)

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


----------



## Milo (14. Okt 2012)

Hi,



vanny hat gesagt.:


> 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:


```
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


----------



## vanny (14. Okt 2012)

Milo hat gesagt.:


> ... aber eigentlich ist es genau dafür gedacht, oder?
> 
> ...



Ich schwanke noch mit meiner Meinung zu dem Thema ^^


----------



## xehpuk (14. Okt 2012)

vanny hat gesagt.:


> 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.


Wohl eher ein [JAPI]DocumentFilter[/JAPI]?


----------



## vanny (14. Okt 2012)

Was hab ich ? :autsch: lol ^^ 

xehpuk hat natürlich recht


----------

