您好看看这段代码。我的目的是让我的应用程序在我输入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();
}
}
答案 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可能会对您有所帮助。它们包括过滤和撤消更改的方法。