AWT如何处理输入以便我可以验证它

时间:2013-09-09 08:23:25

标签: java awt textfield

经过几个小时的重新研究后,我没有找到任何关于awt如何处理任何类型的监听器输入的信息。问题是我必须从VTextField扩展(它在Oracle Forms中使用)。这个类只使用awt。基本上我想要为JTextField提供类似于Documentlistener的东西。阅读this文章后,我有点害怕os确实将输入处理到文本字段中。是否有人能够确认这一点或如何听取任何类型的输入?

感谢你提前阅读。

1 个答案:

答案 0 :(得分:0)

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,以允许真正的输入方法继续工作。