2011-01-06 5 views
1

Ich habe ein JTextField mit einem DocumentListener darauf. Ich möchte die Hintergrundfarbe ändern, wenn ich Zeichen zu diesem Textfeld hinzufüge oder entferne. Ich sollte einen Dokument Listener korrekt verwenden? Es funktioniert, aber es feuert auch, wenn ich den Fokus auf dieses JTextfield verliere und verliere, was unerwünscht ist. Ich füge keinen Fokus-Listener zu diesem JTextField hinzu. Hier ist mein Code, irgendwelche Vorschläge, wie ich mein Problem beheben kann?Warum wird insertUpdate in meinem DocumentListener aufgerufen, wenn ich den Fokus ändere? (Java Swing)

Beachten Sie auch, dass ich JGoodies Binding verwende, von dem ich langsam glaube, dass es die Wurzel dieses Problems ist. Swing ohne JGoodies sollte keine Dokument-Listener-Ereignisse auslösen, indem der Fokus geändert wird ...

Antwort

1

Ich fand es heraus. Es hatte 100% mit JGoodies Binding zu tun.

Dieser Code funktioniert:

ValueModel valueModelNumberPlotRowsJTextField = adapter.getBufferedModel("numberOfPlotRows"); 
    valueModelNumberPlotRowsJTextField.addValueChangeListener(new PropertyChangeListener() { 

     @Override 
     public void propertyChange(PropertyChangeEvent evt) 
     { 
      numPlotRowsJTextField.setBackground(Color.cyan); 
     } 
    }); 
    numPlotRowsJTextField = BasicComponentFactory.createIntegerField(valueModelNumberPlotRowsJTextField); 

Da ich JGoodies bin mit Binding, ich habe ein Valuemodel meine JTextField sichern. Der Listener muss dort und nicht auf dem JTextField gesetzt werden.

1

Sie müssen etwas im Fokus haben, oder Sie denken, dass es feuert und es nicht ist.

Ich nahm Ihren Code und machte ein komplettes Beispiel und es hat nicht das Problem, das Sie beschreiben.

 JFrame frame = new JFrame(); 
    final JTextField numPlotRowsJTextField = new JTextField(3); 
    numPlotRowsJTextField.getDocument().addDocumentListener(new DocumentListener() { 
     @Override 
     public void changedUpdate(DocumentEvent e) { 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      numPlotRowsJTextField.setBackground(Color.cyan); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
     } 
    }); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(100, 100); 
    frame.getContentPane().setLayout(new FlowLayout()); 
    frame.getContentPane().add(new JTextField(2)); 
    frame.getContentPane().add(numPlotRowsJTextField); 
    frame.setVisible(true); 
+0

Ich denke, JGoodies Binding bringt mich irgendwie durcheinander. Es muss dazu führen, dass der DocumentListener insertUpdate auslöst, auch wenn ich gerade den Fokus ändere. Es hat wahrscheinlich mit dem Gesicht zu tun, dass ich JGoodies gepufferte Eingabe und einen Auslöser verwende, der es mir erlaubt, meine Eingabe einfach zurückzusetzen. Irgendwelche JGoodies Bindungsexperten da draußen? – smuggledPancakes

1

Haben Sie sich das DocumentEvent angeschaut, um zu sehen, welche Informationen es enthält? Enthält es tatsächlich eine Zeichenfolge, die geändert wurde? Oder ist es nur ein Ereignis mit einer Länge von 0 Zeichen? Wenn es das letztere ist, dann können Sie vielleicht diesen Fall einfach ignorieren.

Verwandte Themen