Java 在Swing中模拟输入键(不使用机器人)
因此,我试图编写一个JButton,当按下它时,它会像enter键一样工作。它必须能够愚弄处于焦点的JTextField调用其动作侦听器。它不能使用robot框架,因为这会使每个程序都认为按下了enter键,这是一个问题 以下是背景故事: 我有一个程序(用Swing编写),它允许人们在输入数据后按enter键在许多文本字段和其他内容中输入数据。它工作得很好Java 在Swing中模拟输入键(不使用机器人),java,swing,keyboard-events,Java,Swing,Keyboard Events,因此,我试图编写一个JButton,当按下它时,它会像enter键一样工作。它必须能够愚弄处于焦点的JTextField调用其动作侦听器。它不能使用robot框架,因为这会使每个程序都认为按下了enter键,这是一个问题 以下是背景故事: 我有一个程序(用Swing编写),它允许人们在输入数据后按enter键在许多文本字段和其他内容中输入数据。它工作得很好 然而,大多数使用它的人同时都在使用第二个程序,该程序会自动监听回车键并关闭机器人(对于熟悉第一个机器人的人来说,我指的是SmartDashb
然而,大多数使用它的人同时都在使用第二个程序,该程序会自动监听回车键并关闭机器人(对于熟悉第一个机器人的人来说,我指的是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版本是什么?哈哈。。在编辑我的之前从未见过:-)很好,您找到了解决方案。还是觉得奇怪我的不适合你的环境。