2011-01-06 21 views
1

我有一個帶有documentListener的JTextField。當我向該文本字段添加或刪除字符時,我想更改背景顏色。我應該使用文檔偵聽器是否正確?它可以工作,但是當我獲得並失去對這個JTextfield的焦點時,它也會觸發,這是不受歡迎的。我沒有在這個JTextField上添加一個焦點偵聽器。這是我的代碼,關於如何解決我的問題的任何建議?爲什麼更改焦點時,insertUpdate在我的DocumentListener中被調用? (Java Swing)

 numPlotRowsJTextField = BasicComponentFactory.createIntegerField(valueModelNumberPlotRowsJTextField); 
     numPlotRowsJTextField.getDocument().addDocumentListener(new DocumentListener() { 

     @Override 
     public void removeUpdate(DocumentEvent e) 
     { 
     } 

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

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

另請注意,我正在使用JGoodies綁定,我開始相信這個問題的根源。 Swing w/o JGoodies不應該通過改變焦點來觸發文件聆聽者事件...

回答

1

我想通了。它100%與JGoodies Binding有關。

此代碼:

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

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

由於我使用JGoodies數據綁定,我有一個硒lueModel支持我的JTextField。監聽器必須在那裏設置,而不是在JTextField上。

1

你必須有一些東西看着焦點,或者你認爲它正在發射而事實並非如此。

我把你的代碼和一個完整的例子,它沒有你描述的問題。

 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

我認爲JGoodies Binding在某種程度上攪亂了我。即使我只是改變焦點,它也必須導致DocumentListener觸發insertUpdate。這可能與我使用JGoodies緩存輸入的面部表情以及允許我輕鬆重置輸入的觸發器有關。任何JGoodies有約束力的專家? – smuggledPancakes 2011-01-06 15:49:45

1

你看過DocumentEvent,看看它包含哪些信息?它實際上是否包含已更改的字符串?或者它只是一個長度爲0的字符串。如果是後者,那麼也許你可以忽略這種情況。

相關問題