# Texteingabe abfangen



## Ravendark (13. Okt 2008)

Ich habe ein JTextField t und möchte die Texteingaben darauf abfangen,
habe es so probiert:

```
public class Test extends JFrame
{
  private JTextField t = new JTextField();
  // [...]

  private class EingabeAbfangen implements InputMethodListener
  {
    public void caretPositionChanged(InputMethodEvent e) { }
    
    public void inputMethodTextChanged(InputMethodEvent e)
    {
      System.out.println("funktioniert");  // zu dieser Ausgabe kommt es nicht
    }
  }
  // [...]
  t.addInputMethodListener(new EingabeAbfangen());
}
```

Wie gesagt, kommt es zu der Ausgabe "funktioniert" nicht. Irgendeinen Denkfehler hab ich...
Vielleicht gibt es noch einen ganz anderen Weg die Eingabe auf das JTextField abzufangen?

Mfg
Ravendark


----------



## SlaterB (13. Okt 2008)

was das InputMethod-Zeug ist habe ich auf die Schnelle bei google nicht verstanden,
auch hier nicht,
http://java.sun.com/j2se/1.4.2/docs/guide/imf/index.html

jedenfalls dürfte das mit normalen Texteingaben wenig zu tun haben,

wenn du Buchstaben einzeln verfolgen willst, dann nimm einen KeyListener,
noch besser ist vielleicht ein DocumentListener
http://www.iam.ubc.ca/guides/javatut99/uiswing/events/documentlistener.html


----------



## Ravendark (13. Okt 2008)

Stimmt, mit einem KeyListener geht es viel simpler


----------



## Netscanner Waldi (13. Okt 2008)

Ich hab das ganze immer mit DocumentFilter gelöst:

Hier der Part in der GUI:

```
//zuerst ein Regexp-Pattern mit den Zeichen die erlaubt sind
String pattern_txt_port = "^[0-9]*$";

//jetzt das Textfeld
txt_input = new JTextField();

//und nun der Filter
((AbstractDocument)txt_input.getDocument()).setDocumentFilter(new TextSignFilter(pattern_txt_port));
```

Hier Klasse TextSignFilter im Hintergrund (weil man die eh 100mal wiederbenutzt: ausgelagert):

```
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

/**
 * This Filter filters in realtime given signs from textfield 
 */
public class TextSignFilter extends DocumentFilter
{
    String pattern;    
        
    /**
     * Creates a new Filter with given regular expression pattern 
     * @param pattern Regular Expression pattern
     */
    public TextSignFilter(String pattern)
    {
        this.pattern = pattern;
    }
    

    /* (non-Javadoc)
     * @see javax.swing.text.DocumentFilter#insertString(javax.swing.text.DocumentFilter.FilterBypass, int, java.lang.String, javax.swing.text.AttributeSet)
     */
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException 
    { 
        replace(fb, offset, 0, str, attr); 
    }    

    /* (non-Javadoc)
     * @see javax.swing.text.DocumentFilter#replace(javax.swing.text.DocumentFilter.FilterBypass, int, int, java.lang.String, javax.swing.text.AttributeSet)
     */
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException 
    {
        String textInDocument = fb.getDocument().getText(0, fb.getDocument().getLength());
        String testString = textInDocument + str;
        
        if (testString.matches(pattern)) 
        {            
            fb.replace(offset, length, str, attrs);
        }
        else 
        {
            throw new BadLocationException("New characters exceeds max size of document", offset);
        }
    }
}
```
Klappt bei mir immer wunderbar...


----------



## Ravendark (14. Okt 2008)

@Netscanner Waldi:
Thx, funktioniert sehr gut, habe aber noch Fragen zwei Fragen: 

Was kann ich mir unter einem Document vorstellen? ( (AbstractDocument)txt_input.getDocument()  irritiert mich ein bisschen.)

Wird die Methode insertString(...) von der JVM selbstständig aufgerufen und mit Argumenten gefüllt wenn im TextField was geändert wird? (So wie bei vielen Win-API Funktionen.)


Mfg
Ravendark


----------



## Netscanner Waldi (14. Okt 2008)

@Ravendark
Document ist eigentlich dafür gedacht, Texteditoren oä. zu schreiben, wie HTML-Editor oder RTF etc.
Die JVM ruft die insertString(...)-Methode selbstständig auf, direkt und noch bevor Zeichen an die GUI ausgegeben werden.

Der obere Quelltext ist nur ne Abkürzung für
	
	
	
	





```
AbstractDocument abstractDocument = (AbstractDocument) txt_input.getDocument();
abstractDocument.setDocumentFilter(...);
```


----------

