# IP-Adresse mit JFormattedTextField



## waldwichtel (26. Mai 2006)

Hi,

ich hab das Problem dass ich mit einem JFormattedTextField eine IP-Addresse einlesen will. Das geht so weit auch gut. Ich verwede dafür nen MaskFormatter.


```
MaskFormatter fmt = null;

try {
    fmt = new MaskFormatter("###.###.###.###");
} catch (java.text.ParseException e) {
    // Exception Handling
}
JFormattedTextField tft1 = new JFormattedTextField(fmt);
```

Mein Problem ist jetzt aber, wenn ich eine Adresse hab die nicht alle 3 Stellen abdeckt (z.B 192.16.0.1) nimmt mir das Textfeld die Eingabe nicht an. Gibts ne Möglichkeit dem klarzumachen dass es alle Eingaben annehmen soll, wenn in jedem Abschnitt mindestens eine Zahl steht?

Hab schon eine ganze Weile rumgesucht und im Forum gestöbert aber nix wirklich hilfreiches gefunden.


----------



## dieta (26. Mai 2006)

Mit MaskFormatter get das so weit ich weis nicht. Am einfachsten geht das warscheinlich, indem du dir einen eigenen Formatierer definierst. Da musst du die Klasse DefaultFormatter erweitern und die Methoden 
 :arrow: String valueToString(Object value) throws ParseException
 :arrow: Object stringToValue(String text) throws ParseException
überschreiben.


----------



## dieta (26. Mai 2006)

Ich hab jetzt mal (hauptsächlich aus Eigeninteresse) einen eigenen Formatierer für IPs geschrieben:

```
import javax.swing.text.*;
import java.text.*;

class ipFormatter extends DefaultFormatter
{
	
	public String valueToString(Object value) throws ParseException
	{
		if(!(value instanceof byte[]))
		{
			throw new ParseException("Der übergebene Wert ist kein byte[]!", 0);
		}
		byte[] ip = (byte[]) value;
		if(ip.length != 4)
		{
			throw new ParseException("Die Länge des übergebenen Arrays ist nicht 4!", 0);
		}
		String out = "";
		for(int i=0; i<4; i++)
		{
                        int b = ip[i];
                        if(b < 0) b+= 256;
			out += "." + Integer.toString(b);
		}
		return out.substring(1);
	}
	
	public Object stringToValue(String text) throws ParseException
	{
		byte[] ip = new byte[4];
		String[] s = text.split("\\.");
		if(s.length < 4)
		{
			throw new ParseException("Der übergebene String enthält zu wenige Bytes!", 0);
		}
		if(s.length > 4)
		{
			throw new ParseException("Der übergebene String enthält zu viele Bytes!", 0);
		}
		for(int i=0; i<4; i++)
		{
                        int b = Inetger.parseInt(s[i]);
			ip[i] = (byte)b;
			if(b >255 || b <0)
			{
				throw new ParseException("Das "+Integer.toString(i)+". Byte liegt außerhalb des Bereichhes von 0 bis 255!", 0);
			}
		}
		return ip;
	}
	
}
```


----------



## waldwichtel (27. Mai 2006)

Sieht intressant aus, werd ich auf jeden Fall versuchen sobald ich wieder daheim bin, danke


----------



## waldwichtel (28. Mai 2006)

So, ich hab mir das Ganze jetzt mal etwas genauer angschaut und hab noch ein paar Fragen.
1) Dass ein Byte von -128 bis 127 geht ist mir soweit klar. Ich hab aber noch ein bischen ein Verständnissproblem mit den Netztwerkbytes. Wie würde z.B die IP 192.168.0.1 als byte[] ausehen?

2) Wie genau muss ich den den Formatter jetzt ins Textfeld einbauen?


----------



## dieta (28. Mai 2006)

Sorry, mir ist da ein Fehler unterlaufen. Der Code oben ist in zwischen angepasst. Es müsste jetzt funktionieren.

1) Diese IP würde als byte[] so aussehen:
{-64,-88,0,1}
(Überlauf)

2) Das geht so:

```
JFormattedTextField t = new JFormattedTextField(new ipFormatter());
```


----------

