有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在单击按钮时显式触发按键事件

当按钮点击时,是否有任何机制明确触发按键事件。 当我单击java UI中名为“+”的按钮时,它将显式触发“+”按键事件


共 (1) 个答案

  1. # 1 楼答案

    有很多方法可以实现这一点,你使用哪种方法取决于你想做什么

    你可以

    使用java.awt.Robot,这将允许您在本机事件队列中生成密钥事件。但请记住,此事件(最终)将被发送到具有当前键盘焦点的组件

    Robot bot = new Robot();
    bot.setAutoDelay(250);
    bot.keyPress(KeyEvent.SHIFT_KEY);
    bot.keyPress(KeyEvent.EQUALS); // Shift + "=" = +
    bot.keyRelease(KeyEvent.EQUALS);
    bot.keyRelease(KeyEvent.SHIFT_KEY);
    

    你可以

    手动调度事件。如果试图将事件发送到另一个组件(例如字段),则可以手动发送事件

    field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_EQUALS, '+'));
    field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_TYPED, System.currentTimeMillis(), KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_EQUALS, '+'));
    field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_EQUALS, '+'));
    

    例如

    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class ButtonTrigger {
    
        public static void main(String[] args) {
            new ButtonTrigger();
        }
    
        public ButtonTrigger() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            private JTextField field;
            private JButton button;
    
            public TestPane() {
                setLayout(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;
    
                field = new JTextField(10);
                button = new JButton("+");
    
                add(field, gbc);
                add(button, gbc);
    
                button.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_EQUALS, '+'));
                        field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_TYPED, System.currentTimeMillis(), KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_UNDEFINED, '+'));
                        field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_EQUALS, '+'));
                    }
                });
            }
    
        }
    
    }