Java 在Swing中模拟输入键(不使用机器人)

Java 在Swing中模拟输入键(不使用机器人),java,swing,keyboard-events,Java,Swing,Keyboard Events,因此,我试图编写一个JButton,当按下它时,它会像enter键一样工作。它必须能够愚弄处于焦点的JTextField调用其动作侦听器。它不能使用robot框架,因为这会使每个程序都认为按下了enter键,这是一个问题 以下是背景故事: 我有一个程序(用Swing编写),它允许人们在输入数据后按enter键在许多文本字段和其他内容中输入数据。它工作得很好 然而,大多数使用它的人同时都在使用第二个程序,该程序会自动监听回车键并关闭机器人(对于熟悉第一个机器人的人来说,我指的是SmartDashb

因此,我试图编写一个JButton,当按下它时,它会像enter键一样工作。它必须能够愚弄处于焦点的JTextField调用其动作侦听器。它不能使用robot框架,因为这会使每个程序都认为按下了enter键,这是一个问题

以下是背景故事:

我有一个程序(用Swing编写),它允许人们在输入数据后按enter键在许多文本字段和其他内容中输入数据。它工作得很好


然而,大多数使用它的人同时都在使用第二个程序,该程序会自动监听回车键并关闭机器人(对于熟悉第一个机器人的人来说,我指的是SmartDashboard和驾驶台)。对此有不少抱怨。人们希望在不禁用机器人的情况下输入数据。事实证明,SmartDashboard(人们希望点击enter的程序)允许自定义swing组件与之一起运行。

您可以在框架上尝试。有一个例子。

不完全确定我是否正确理解您的需求(如果不正确,将删除此项)

您可以手动将事件分派到要寻址的任何组件。如果想要发送给focusOwner

  • 通过查询KeyboardFocusManager找到focusOwner
  • 以focusOwner作为发送方创建keyEvent
  • 将该事件发送给focusOwner
比如:

Action action = new AbstractAction("fake enter") {

    @Override
    public void actionPerformed(ActionEvent e) {
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        Component comp = manager.getFocusOwner();
        KeyEvent event = new KeyEvent(comp, 
                KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, 
                KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED);
        comp.dispatchKeyEvent(event);
    }
};
JButton button = new JButton(action);
button.setFocusable(false);

Action textAction = new AbstractAction("text") {

    @Override
    public void actionPerformed(ActionEvent e) {
        LOG.info("I'm the text action" + ((Component) e.getSource()).getName());
    }
};

JComponent comp = Box.createVerticalBox();
for (int i = 0; i < 5; i++) {
    JTextField field = new JTextField(20);
    field.setName(": " + i);
    field.setAction(textAction);
    comp.add(field);
}
comp.add(button);
Action Action=new AbstractAction(“假输入”){
@凌驾
已执行的公共无效操作(操作事件e){
KeyboardFocusManager=KeyboardFocusManager.getCurrentKeyboardFocusManager();
组件comp=manager.getFocusOwner();
KeyEvent事件=新的KeyEvent(组件,
按下KeyEvent.KEY_,System.currentTimeMillis(),0,
KeyEvent.VK_输入,KeyEvent.CHAR_未定义);
公司调度键事件(事件);
}
};
JButton按钮=新JButton(操作);
按钮。设置可聚焦(假);
Action textAction=新的抽象操作(“文本”){
@凌驾
已执行的公共无效操作(操作事件e){
LOG.info(“我是文本操作”+((组件)e.getSource()).getName());
}
};
JComponent comp=Box.createVerticalBox();
对于(int i=0;i<5;i++){
JTextField=新的JTextField(20);
field.setName(“:”+i);
field.setAction(textAction);
成分添加(字段);
}
组件添加(按钮);
编辑


为实际使用它添加了一些台词(@Joe评论它不起作用)。单击该按钮将触发聚焦文本字段的操作(此处仅打印字段名称),本地上下文为vista和jdk6u27

抓取具有焦点的元素并手动分派一个enter事件并不十分有效,但因为我只是想影响各种JTextField,所以我想出了一个类似的解决方案:

addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
        if (focusOwner instanceof JTextField) {
            ((JTextField) focusOwner).postActionEvent();
        }
    }   
});

感谢您为我指明了正确的方向。

是否可以使用与enter不同的组合键?如果想将字段填充为“保存”输入,这不是不可能的,但它当然不是首选。我还考虑过让tab(即,当您失去焦点时)保存数据,但我真的希望将其保留为enter键。。不完全确定,但我认为要求是相反的:-)仔细想想,你可能是对的+1用于逆向
操作
。我可以让它响应我想要的任何信件(比如如果我发送了“a”字符,就会键入一个“a”),但我不能用enter键让它工作。@Joe-hmm。。。这很奇怪:我回答中的代码片段触发了文本字段的操作(当然,在发布之前尝试过:-)您的操作系统和jdk版本是什么?哈哈。。在编辑我的之前从未见过:-)很好,您找到了解决方案。还是觉得奇怪我的不适合你的环境。