2012-05-25 20 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)); 
     } 
    }); 
相关问题