java.awt.Robot : 命中助记键无效
java.awt.Robot : hit mnemonics key not working
我创建了一个使用 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();
}
}
两件事,首先,您应该使用 KeyEvent.VK_ALT
而不是 KeyEvent.ALT_MASK
,其次,当您 Robot
时,window 可能不是 visible/active代码执行时,您需要等到 window 可见,即便如此,您可能需要在将来的某个时间执行任务以确保 OS 使 window可见,例如...
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());
}
}
}
我创建了一个使用 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();
}
}
两件事,首先,您应该使用 KeyEvent.VK_ALT
而不是 KeyEvent.ALT_MASK
,其次,当您 Robot
时,window 可能不是 visible/active代码执行时,您需要等到 window 可见,即便如此,您可能需要在将来的某个时间执行任务以确保 OS 使 window可见,例如...
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());
}
}
}