caretPositionChanged()方法没有反应

时间:2013-11-03 17:35:22

标签: java text input textarea listener

您好看看这段代码。我的目的是让我的应用程序在我输入slowa[]中列出的单词之一的textarea时作出反应。你可以看到我创建了inputMethodListner然而当我输入它正在起作用的任何单词时。我试图调试打印以查看发生了什么,我发现方法inputMethodTextChanged()inputMethodTextChanged()都没有被调用一次:(我做错了什么?

import java.awt.*; 
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;

import javax.swing.*; 

public class BrzydkieSlowa extends JFrame { 
static String[] slowa = {"shit", "fuck"};

   private BrzydkieSlowa(){

          //Create and set up the window. 
          JFrame frame = new JFrame("Brzydkie slowa");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

          final JTextArea textArea1 = new JTextArea(10,10);
          textArea1.addInputMethodListener(new InputMethodListener() {
              @Override
              public void caretPositionChanged(InputMethodEvent arg0) {
                  int brzydkie = 0;
                  int i = 0;
                  while(brzydkie == 1 || i > 1){
                      if(textArea1.getText().compareTo(slowa[i])== 0)
                          brzydkie = 0;
                      i++;
                  }
                  if(brzydkie == 1)
                      JOptionPane.showMessageDialog(null, "brzydkie slowo");
              }
              @Override
              public void inputMethodTextChanged(InputMethodEvent event) {
                // TODO Auto-generated method stub

              }
          });
          frame.getContentPane().add(textArea1, BorderLayout.CENTER); 

          //Display the window. 
          frame.setLocationRelativeTo(null); 
          frame.pack();
          frame.setVisible(true); 
       }
public static void main(String[] args) {
    new BrzydkieSlowa();

}

}

1 个答案:

答案 0 :(得分:1)

您应该使用DocumentListener代替。 尝试

textArea1.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent e) {
            String text = textArea1.getText();
            int firstOccurence = StringUtils.indexOfAny(text, slowa); 
            if (firstOccurence > -1) {
                /* do something */
            }
        }           
        @Override
        public void removeUpdate(DocumentEvent e) {/* do nothing */ }
        @Override
        public void changedUpdate(DocumentEvent e) { /* do nothing */ }
    });

请通知如何“编写文档侦听器”警告不要修改文本:

  

文档监听器不应修改文档的内容;在收听者收到更改通知时,更改已完成。相反,请编写一个自定义文档,该文档会覆盖insertString()remove()方法,或两者​​兼而有之。

文档模型有some examples可能会对您有所帮助。它们包括过滤和撤消更改的方法。