2012-05-25 47 views
2

我想在更改JTextField的文本後調用方法。java documentlistener

textField.getDocument().addDocumentListener(new DocumentListener() 
     { 

      public void changedUpdate(DocumentEvent arg0) 
      { 
       System.out.println("IT WORKS"); 
       panel.setPrice(panel.countTotalPrice(TabPanel.this)); 
      } 
      public void insertUpdate(DocumentEvent arg0) 
      { 

      } 

      public void removeUpdate(DocumentEvent arg0) 
      { 

      } 
     }); 

當我在另一個ActionListener中調用此方法時,它工作正常。但是當我在文本字段中改變文本時,什麼也沒有發生。即使是println。有什麼建議麼?

+0

您是否試圖更改'textField'中的值?如果是這樣,您不能因爲文檔監聽器不能更改它們分配給的文本字段中的值。 – kentcdodds

回答

1

嘗試使用ActionListener

textField.addActionListener(this); 

... 
public void actionPerformed(ActionEvent evt) { 
    String s = textField.getText(); 
    System.out.println(s); 
    ... 
} 
7

的問題就迎刃而解了。 changedUpdated方法僅在其他屬性(字體,大小,但不是文本)發生更改時調用。要在每次更改文本後調用方法,我應該將該調用放入insertUpdate和removeUpdate方法。通過這種方式:

textField.getDocument().addDocumentListener(new DocumentListener() 
     { 

      public void changedUpdate(DocumentEvent arg0) 
      { 

      } 
      public void insertUpdate(DocumentEvent arg0) 
      { 
       System.out.println("IT WORKS"); 
       panel.setPrice(panel.countTotalPrice(TabPanel.this)); 
      } 

      public void removeUpdate(DocumentEvent arg0) 
      { 
       System.out.println("IT WORKS"); 
       panel.setPrice(panel.countTotalPrice(TabPanel.this)); 
      } 
     }); 
0

我發現這個解決方案最快:

new JTextPane().addActionListener(new Key()); 

class Key extends KeyAdapter{ 
private static final Object lock = new Object(); 
     private static int keydiff=0; 
     public void keyReleased(KeyEvent e) { 
      switch(e.getKeyCode()) 
      { 
       //IGNORE FUNCTIONAL KEYS 
       case 38 : 
       case 39 : 
       case 37 : 
       case 40 : 
       case 17 : 
       case 157 : 
       case 10 : break; 
       default : keydiff++; 
      } 

      if(keydiff!=0) 
      { 
       synchronized(lock){ 
        keydiff=0; 
        //EVENT FIRED HERE 
       }    
      } 
     } 
    } 

它比快得多:

.getDocument().addDocumentListener(.... changeUpdate()) 
+0

這有點可疑。如果以後可以在沒有鍵盤的情況下更改字段內容,該怎麼辦? (例如「重置字段」按鈕或撤消)。複製和粘貼如何?使用適當的方法更安全。 – GKFX

0

這裏是另一個解決您的問題。不必在每種方法下重複相同的代碼,您可以創建一個方法併爲changedUpdate,insertUpdate,removeUpdate調用該方法。

textField.getDocument().addDocumentListener(new DocumentListener() 
    { 

     public void changedUpdate(DocumentEvent arg0) 
     { 
      printMyLines(); 
     } 
     public void insertUpdate(DocumentEvent arg0) 
     { 
      printMyLines(); 
     } 

     public void removeUpdate(DocumentEvent arg0) 
     { 
      printMyLines(); 
     } 

     private void printMyLines() 
     { 
      System.out.println("IT WORKS"); 
      panel.setPrice(panel.countTotalPrice(TabPanel.this)); 
     } 
    }); 
相關問題