代码之家  ›  专栏  ›  技术社区  ›  nantitv

java.awt。机器人:按下助记符键不起作用

  •  0
  • nantitv  · 技术社区  · 11 年前

    我创建了一个使用awt的简单程序。机器人应该按下ALT+F键,它应该打开一个菜单项。但它不起作用。 最初我认为焦点问题。然后我添加了一个虚拟按钮来获得焦点,但id仍然不起作用。

    请查看代码

    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.InputEvent;
    import java.awt.event.KeyEvent;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    
    class MenuActionListener implements ActionListener {
    
        public void actionPerformed(ActionEvent actionEvent) {
    
            System.out.println("Selected: " + actionEvent.getActionCommand());
    
        }
    }
    
    public class MenuAction {
    
        public static void main(final String args[]) throws AWTException {
    
            ActionListener menuListener = new MenuActionListener();
    
            JFrame frame = new JFrame("MenuSample Example");
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JMenuBar menuBar = new JMenuBar();
    
            // File Menu, F - Mnemonic
            JMenu fileMenu = new JMenu("File");
            fileMenu.setMnemonic(KeyEvent.VK_F);
            menuBar.add(fileMenu);
    
            // File->New, N - Mnemonic
            JMenuItem newMenuItem = new JMenuItem("New", KeyEvent.VK_N);
            newMenuItem.addActionListener(menuListener);
            fileMenu.add(newMenuItem);
    
            frame.setJMenuBar(menuBar);
            frame.setSize(650, 650);
    
            JButton button = new JButton("Test");
            frame.getContentPane().add("South", button);
            frame.setBounds(100, 100, 400, 400);
            frame.setVisible(true);
    
            button.requestFocusInWindow();
    
            Robot robot = new Robot();
    
            robot.setAutoDelay(500);
    
            robot.waitForIdle();
    
            robot.keyPress(KeyEvent.ALT_MASK);
    
            robot.keyPress(KeyEvent.VK_F);
            robot.keyRelease(KeyEvent.VK_F);
            robot.keyRelease(KeyEvent.ALT_MASK);
            robot.waitForIdle();
        }
    }
    
    1 回复  |  直到 11 年前
        1
  •  3
  •   MadProgrammer    10 年前

    两件事,首先,你应该使用 KeyEvent.VK_ALT 而不是 KeyEvent.ALT_MASK 第二,当您 Robot 代码执行时,您需要等待窗口变为可见,即使如此,您也可能需要在未来某个时间执行该任务,以确保操作系统已使窗口可见,例如。。。

    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.InputEvent;
    import java.awt.event.KeyEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.SwingUtilities;
    
    public class MenuAction {
    
        public static void main(final String args[]) throws AWTException {
    
            ActionListener menuListener = new MenuActionListener();
    
            JFrame frame = new JFrame("MenuSample Example");
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JMenuBar menuBar = new JMenuBar();
    
            // File Menu, F - Mnemonic
            JMenu fileMenu = new JMenu("File");
            fileMenu.setMnemonic(KeyEvent.VK_F);
            menuBar.add(fileMenu);
    
            // File->New, N - Mnemonic
            JMenuItem newMenuItem = new JMenuItem("New", KeyEvent.VK_N);
            newMenuItem.addActionListener(menuListener);
            fileMenu.add(newMenuItem);
    
            frame.setJMenuBar(menuBar);
            frame.setSize(650, 650);
    
            JButton button = new JButton("Test");
            frame.getContentPane().add("South", button);
            frame.setBounds(100, 100, 400, 400);
            frame.addWindowListener(new WindowAdapter() {
    
                @Override
                public void windowOpened(WindowEvent e) {
                    button.requestFocusInWindow();
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
    
                            try {
                                Robot robot = new Robot();
    
                                robot.setAutoDelay(500);
    
                                robot.waitForIdle();
    
                                robot.keyPress(KeyEvent.VK_ALT);
    
                                robot.keyPress(KeyEvent.VK_F);
                                robot.keyRelease(KeyEvent.VK_F);
                                robot.keyRelease(KeyEvent.VK_ALT);
                                robot.waitForIdle();
                            } catch (AWTException exp) {
                                exp.printStackTrace();
                            }
                        }
                    }).start();
                }
            });
            frame.setVisible(true);
        }
    
        public static class MenuActionListener implements ActionListener {
    
            public void actionPerformed(ActionEvent actionEvent) {
    
                System.out.println("Selected: " + actionEvent.getActionCommand());
    
            }
        }
    }
    
    推荐文章