JTextField ChangeListener?

Ola,

Estou pesquisando como fazer um Change Listener decente para um JTextField. Eu ja uso uma classe derivada de PlainDocument para tratar o insertString e o removeUpdate. Portanto, se o usuario insere ou remove um caracter, eu capturo o “Change” do campo. Mas tem outras situacoes onde eu preciso dar um “setText” no campo, e neste caso o insertString (nem o insertUpdate) sao disparados, e portanto eu nao consigo fazer uma captura decente do “Change”. Eu precisaria de um lugar que cercasse todas as possibilidades de mudanca do conteudo do campo.

Vc poderia colocar um listener no Document para controlar as alterações, o listener percebe inclusive alterações via setText …

Fallow

OK, eu fiz isso, baseando-me no link:
http://java.sun.com/docs/books/tutorial/uiswing/events/documentlistener.html
Ele funciona exatamente como antes, ou seja, eu transferi o codigo que estava dentro do meu Document para o DocumentListener (insert/remove) e continua funcionando apenas quando eu edito o campo, e nao quando eu faco o setText.

Hmmm, estranho!!!
Dá uma olhada nesse exemplo q fiz agora!!!

public class ChangeText extends JFrame {
  public ChangeText() {
    super("Teste");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300, 300);
    Container c = getContentPane();
    c.setLayout(new FlowLayout());
    final JTextField field = new JTextField();
    PlainDocument doc = (PlainDocument) field.getDocument();
    doc.addDocumentListener(new DocumentListener() {
      public void changedUpdate(DocumentEvent e) {
        System.out.println("Updated");
      }
      public void insertUpdate(DocumentEvent e) {
        System.out.println("Inserted");
      }
      public void removeUpdate(DocumentEvent e) {
        System.out.println("Deleted");
      }
    }); 
    field.setColumns(10);
    JButton action = new JButton("Executa");
    action.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        field.setText("Novo Teste");
      }
    }); 
    c.add(field);
    c.add(action);
  }
  
  public static void main(String[] args) {
    new ChangeText().show();
  }
}

Ve se funfa aí!!!

Fallow

Corrigindo… como eu estava limpando o setText em um outro lugar depois do setText certo entao deu problema. Agora esta realmente funcionando 100% Document+DocumentListener.