经过几个小时的研究,我没有找到任何关于 awt 如何处理任何类型的侦听器的输入的信息。问题是我必须从 VTextField 扩展(它用于 Oracle Forms)。这个类只使用 awt。基本上我希望有类似于 JTextField 的 Documentlistener 的东西。读完这篇文章后,我有点害怕操作系统确实将输入处理到文本字段中。有没有人能够确认这一点或如何听到任何类型的输入?
感谢您提前阅读本文。
AWT 并不意味着被 Java 代码拦截。但是,您查看输入法的想法是正确的方向。这是一个示例类,它将过滤掉进入文本字段的事件中简单插入的“a”字符。它可以作为一个起点。
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.im.InputContext;
import java.lang.Character.Subset;
import java.util.Locale;
class SpecialTextField extends TextField {
InputContext customIC=new InputContext() {
@Override
public void dispatchEvent(AWTEvent event) {
if(event.getID()==KeyEvent.KEY_TYPED) {
KeyEvent ev=(KeyEvent)event;
if(ev.getKeyChar()=='a') {
ev.consume();
return;
}
}
SpecialTextField.super.getInputContext().dispatchEvent(event);
}
public boolean selectInputMethod(Locale locale) {
return SpecialTextField.super.getInputContext().selectInputMethod(locale);
}
public Locale getLocale() {
return SpecialTextField.super.getInputContext().getLocale();
}
public void setCharacterSubsets(Subset[] subsets) {
SpecialTextField.super.getInputContext().setCharacterSubsets(subsets);
}
public void setCompositionEnabled(boolean enable) {
SpecialTextField.super.getInputContext().setCompositionEnabled(enable);
}
public boolean isCompositionEnabled() {
return SpecialTextField.super.getInputContext().isCompositionEnabled();
}
public void reconvert() {
SpecialTextField.super.getInputContext().reconvert();
}
public void removeNotify(Component client) {
SpecialTextField.super.getInputContext().removeNotify(client);
}
public void endComposition() {
SpecialTextField.super.getInputContext().endComposition();
}
public void dispose() {
SpecialTextField.super.getInputContext().dispose();
}
public Object getInputMethodControlObject() {
return SpecialTextField.super.getInputContext().getInputMethodControlObject();
}
};
@Override
public InputContext getInputContext() {
return customIC;
}
}
dispatchEvent
方法是魔法发生的地方。所有其他方法只是委托给原始 InputContext 以允许真正的输入方法继续工作。