2013-11-03 47 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爲文檔模型可能會幫助你。他們包括過濾和撤消更改的方法。