2013-11-03 46 views
0

嗨看看这段代码。我的目标是让我的应用程序反应,当我将输入一个textarea之一在slowa[]列出的单词之一。正如你可以看到我创建inputMethodListner然而,当我输入任何它正在工作的词。我tryied把调试打印,看看是怎么回事,我看到两个方法都inputMethodTextChanged()也不inputMethodTextChanged()被称为甚至一度:(什么即时做错了什么?caretPositionChanged()方法没有反应

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

您应该使用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 */ } 
    }); 

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

文档听众不应该莫迪fy文件的内容;在听者收到更改通知时,更改已经完成。相反,编写一个覆盖insertString()remove()方法或两者的自定义文档。

some examples为文档模型可能会帮助你。他们包括过滤和撤消更改的方法。