java.awt.Robot:命中助记键不起作用

时间:2015-08-05 07:27:19

标签: java swing awtrobot mnemonics

我创建了一个简单的程序来使用awt.robot,据说按下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 个答案:

答案 0 :(得分:3)

首先,你应该使用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());

        }
    }
}