Java 将按键发送到JTextField

Java 将按键发送到JTextField,java,events,swing,keyboard-events,Java,Events,Swing,Keyboard Events,我试图模拟文本输入到JTextField。我有一个1字符长的字符串,其中包含我要添加的字母,我运行: receiver.dispatchEvent(new KeyEvent(this, KeyEvent.KEY_TYPED, 0, this.shifted?KeyEvent.SHIFT_DOWN_MASK:0, KeyEvent.VK_UNDEFINED, text.charAt(0))); 但这似乎根本没有改变内容。我在这里遗漏了什么?在我看来就像一个虚拟键盘:-) 几乎完全相同

我试图模拟文本输入到
JTextField
。我有一个1字符长的字符串,其中包含我要添加的字母,我运行:

receiver.dispatchEvent(new KeyEvent(this,
  KeyEvent.KEY_TYPED, 0,
  this.shifted?KeyEvent.SHIFT_DOWN_MASK:0,
  KeyEvent.VK_UNDEFINED, text.charAt(0)));

但这似乎根本没有改变内容。我在这里遗漏了什么?

在我看来就像一个虚拟键盘:-)

几乎完全相同的代码对我有效。我建议如下:

  • 将目标
    JTextField
    (在您的情况下为
    receiver
    )作为
    source
    参数传递给
    KeyEvent
    构造函数,即:

    receiver.dispatchEvent(new KeyEvent(receiver,
        KeyEvent.KEY_TYPED, System.currentTimeMillis(),
        modifiers, KeyEvent.VK_UNDEFINED, keyChar);
    
  • 确保您的目标
    JTextField
    具有焦点

  • 编辑:

    为了验证上述建议,我测试了以下代码片段:

    Frame frame = new Frame();
    TextField text = new TextField();
    frame.add(text);
    frame.pack();
    frame.setVisible(true);
    
    text.dispatchEvent(new KeyEvent(frame,
            KeyEvent.KEY_TYPED, 0,
            0,
            KeyEvent.VK_UNDEFINED, 'H'));
    
    这不起作用,但是如果最后一行修改如下(目标组件作为
    KeyEvent
    构造函数的
    source
    参数),它可以正常工作:

    text.dispatchEvent(new KeyEvent(text,
            KeyEvent.KEY_TYPED, 0,
            0,
            KeyEvent.VK_UNDEFINED, 'H'));
    

    对我有用。你能发布一些代码来证明这不起作用吗?是的,这是一个虚拟键盘,不,我没有关注文本字段。我一回到项目中就会尝试这个方法。确保检查其他建议(将目标组件作为
    KeyEvent
    source
    传递)。我在我的一个项目中也遇到了同样的问题。而且,为了将来的参考,我不需要关注。将文本字段设置为事件源并添加适当的时间就足够了。很好。我相信组件必须是可聚焦的,即使它目前没有焦点。不过,这不是标准组件的问题。