public class IPDocument
extends PlainDocument
{
public String initString = "000.000.000.000";
private static int sep1 = 3, sep2 = 7, sep3 = 11;
private JTextComponent textComponent;
private int newOffset;
/**************************************************************************
* Überprüft eingegebenes Zeichen auf seine Gültigkeit->
* Buchstaben oder sonstige Zeichen sind nicht zulässig
* @param tc JTextComponent
************************************************************************/
public IPDocument(JTextComponent tc)
{
textComponent = tc;
try
{
insertString(0, initString, null);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
/**************************************************************************
* Versucht das eingegebene Zeichen auf einen Integer zu parsen. Zusätzlich wird
* überprüft, wo sich der Cursor befindet (womöglich vor einem Trennzeichen, das
* übersprungen werden soll). Tage und Monate werden bereits während der Eingabe
* auf ihre Gültigkeit (z.B. Tag: 32 -> falsch, Monat: 13 -> falsch) überprüft.
* @param offset Position im String (ist zu vergleichem mit dem Initialisierungsstring)
* @param s Zeichen, das überprüft wird
* @param attributeSet AttributeSet wird nur an die Vaterklasse weitergeleitet
* @throws BadLocationException wird geworfen, wenn das Zeichen nicht geparst werden kann
*************************************************************************/
public void insertString(int offset, String s, AttributeSet attributeSet) throws
BadLocationException
{
if (s.equals(initString))
{
super.insertString(offset, s, attributeSet);
}
else
{
//setzt die Punkte nach vor
if (s.compareTo(".") == 0)
{
if(offset <= sep1)
{
newOffset = sep1+1;
textComponent.setCaretPosition(newOffset);
}
else if(offset <= sep2)
{
newOffset = sep2+1;
textComponent.setCaretPosition(newOffset);
}
else if(offset <= sep3)
{
newOffset = sep3+1;
textComponent.setCaretPosition(newOffset);
}
return;
}
try
{
if (s.length() > 1)
{
//wenn der String größer als 1 ist, ist es eine ganze IP und somit eine Schleife -- dies passiert bei JTextField.setText("192.168.0.1"); -- als Bsp
for(int x = 0; x != s.length(); x++)
{
if(s.substring(x,x+1)!= ".")
{
insertString(x,s.substring(x,x+1),null);
}
}
//mach gar nix, weil die for schleife alles macht!
return;
}
//wenn es keine Zahl ist!
Integer.parseInt(s);
}
catch (Exception ex)
{
Toolkit.getDefaultToolkit().beep();
return;
}
newOffset = offset;
if (atSeparator(offset))
{
newOffset++;
textComponent.setCaretPosition(newOffset);
}
super.remove(newOffset, 1);
super.insertString(newOffset, s, attributeSet);
}
}
/***************************************************************************
*
* @param offset Position im String (ist zu vergleichen mit dem Inititialisierungsstring)
* @param length Länge des Strings
* @throws BadLocationException Wenn eine Position nicht verwendet bzw. ermittelt werden kann
*************************************************************************/
public void remove(int offset, int length) throws BadLocationException
{
if (atSeparator(offset))
{
textComponent.setCaretPosition(offset - 1);
}
else
{
textComponent.setCaretPosition(offset);
}
}
/**************************************************************************
* @param offset Position im String (ist zu vergleichen mit dem Initialisierungsstring)
* @return boolean, true für Separater ist am offset, false für kein
*************************************************************************/
public boolean atSeparator(int offset)
{
return offset == sep1 || offset == sep2 || offset == sep3; //false
}