Texteingabe abfangen

Status
Nicht offen für weitere Antworten.

Ravendark

Aktives Mitglied
Ich habe ein JTextField t und möchte die Texteingaben darauf abfangen,
habe es so probiert:
Code:
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
 
Ich hab das ganze immer mit DocumentFilter gelöst:

Hier der Part in der GUI:
Code:
//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):
Code:
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...
 
@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
 
@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
Code:
AbstractDocument abstractDocument = (AbstractDocument) txt_input.getDocument();
abstractDocument.setDocumentFilter(...);
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben