Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AWT如何处理输入以便我可以验证它_Java_Awt_Textfield - Fatal编程技术网

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

Java AWT如何处理输入以便我可以验证它,java,awt,textfield,Java,Awt,Textfield,在重新搜索了几个小时后,我没有找到任何关于awt如何处理输入到任何类型侦听器的信息。问题是我必须从VTextField扩展(它在Oracle表单中使用)。这个类只使用awt。基本上,我希望JTextField具有类似于Documentlistener的内容。读完这篇文章后,我有点害怕操作系统会处理文本字段中的输入。是否有人能够确认这一点,或者如何能够听到任何类型的输入 感谢您提前阅读。AWT不应该被Java代码拦截。然而,你看待输入法的想法是正确的方向。下面是一个示例类,该类将从发送到文本字段的

在重新搜索了几个小时后,我没有找到任何关于awt如何处理输入到任何类型侦听器的信息。问题是我必须从VTextField扩展(它在Oracle表单中使用)。这个类只使用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,以允许真正的输入方法继续工作。

hmmm大多数侦听器都来自AWT包,只有少数高级抽象或侦听器(swing.Text、JList、JTable)在Java5/6中添加的是从Swing Packages导入的,基本上我希望JTextField具有类似于Documentlistener的内容谢谢,textlistener正在工作。我尝试了inputMethodListener,它的方法与Textlistener相同,我想知道为什么它不起作用…测试什么触发了Textlistener.textChanged(text,previousText);,我想用数组、地图、phaaaa存储历史,我真的不知道,brrrrI认为真正的答案可能只有安德鲁·汤普森、卡米克、装满鳗鱼的气垫船、斯坦尼斯拉夫、戴姆写下自己的shouldYieldFocus()和verify(),以及基于KeyboardFocusManager/KeyListener的aka DocumentFilter