因此,我试图编写一个JButton,当按下它时,它会像回车键一样。它必须能够欺骗重点在于调用其操作侦听器的JTextField。它不能使用机器人框架,因为这会使每个程序都认为按下Enter键,这是一个问题。

这是背景故事:

我有一个程序(用Swing编写),该程序允许某人在输入数据后通过按Enter来在许多文本字段和其他内容中输入数据。效果很好。

但是,大多数使用它的人会同时使用第二个程序,该程序会自动侦听Enter键并关闭机器人(对于那些熟悉FIRST机器人技术的人,我在谈论SmartDashboard和驱动程序站)。对此有很多抱怨。人们希望在不禁用机器人的情况下输入数据。事实证明,SmartDashboard(人们想要点击进入的程序)允许与它一起运行自定义挥杆组件。

最佳答案

不确定我是否正确理解了您的要求(如果不正确,将其删除)...

您可以手动将事件调度到要处理的任何组件。在要分派给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);
    

    编辑

    添加了一些实际使用它的代码(@Joe认为它不起作用)。单击按钮将触发聚焦的textField的操作(此处仅打印出字段的名称)。本地上下文是vista和jdk6u27。

    09-10 09:36
    查看更多