0

こんにちは、このコードの断片を見てください。私の目的は、にリストされている単語の 1 つをテキストエリアに入力すると、アプリが反応するようにすることですslowa[]。ご覧のとおり、作成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();

}

}
4

1 に答える 1

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 */ }
    });

How to "Write a Document Listener" がテキストの変更に対して警告していることを通知してください:

ドキュメント リスナは、ドキュメントの内容を変更しないでください。リスナーに変更が通知されるまでに、変更はすでに完了しています。insertString()代わりに、またはremove()メソッド、あるいはその両方をオーバーライドするカスタム ドキュメントを記述します。

Document モデルの例がいくつかあります。それらには、フィルター変更と元に戻すためのアプローチが含まれていました。

于 2013-12-13T17:25:57.897 に答える