希望我能够很好地解释这个问题。
我的堂兄被禁用,并使用一个按钮来控制计算机上的应用程序。所有这些应用程序都是定制的,它们依赖于循环焦点和粗体突出显示的按钮。通过执行此操作,您只需在突出显示按钮时单击,这样就无需移动鼠标。
我现在正在为他制作一个小游戏,我已经遇到了关注部分。我正在使用一个线程循环焦点,LayoutButton.requestFocus();
来获得焦点。
如果按下空格键,则此方法有效,但是他使用的按钮会按下鼠标左键。
有没有办法将按钮的焦点设置为鼠标左键?因此鼠标必须有效地指向按钮,因此当您单击鼠标时按钮会按下。然后它必须将该按钮解除焦点并重新聚焦在下一个按钮上。合理?
如果有人能指出我正确的方向,我会很感激。谢谢!
答案 0 :(得分:1)
requestFocusInWindow
代替requestFocus
,requestFocus
取决于系统,因此其功能未定义Robot
课程将鼠标光标的位置更改为坐在按钮上。您需要使用Component#getLocationOnScreen
和Robot#mouseMove
像...一样的东西。
try {
button.requestFocusInWindow();
Robot bot = new Robot();
Point pos = button.getLocationOnScreen();
bot.mouseMove(pos.x + (button.getWidth() / 2), pos.y + (button.getHeight() / 2));
} catch (AWTException ex) {
Logger.getLogger(TestRobot.class.getName()).log(Level.SEVERE, null, ex);
}
更新了示例
好的,这是一个有效的例子。它内置了一个计时器,可以简单地移动到下一个可聚焦组件。
我已将焦点组件附加到每个按钮,将鼠标移动到每个按钮的中心。
这意味着您可以允许计时器移动到下一个组件或按Tab键,您应该得到相同的结果
public class TestFocusTransversal {
public static void main(String[] args) {
new TestFocusTransversal();
}
public TestFocusTransversal() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ButtonPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
});
}
public class ButtonPane extends JPanel {
public ButtonPane() {
setLayout(new GridLayout(3, 2));
FocusHandler focusHandler = new FocusHandler();
ActionHandler actionHandler = new ActionHandler();
for (int index = 0; index < 6; index++) {
JButton button = new JButton("Button " + index);
button.addActionListener(actionHandler);
button.addFocusListener(focusHandler);
add(button);
}
}
}
public class FocusHandler extends FocusAdapter {
@Override
public void focusGained(FocusEvent e) {
try {
Robot bot = new Robot();
Component component = e.getComponent();
Point pos = component.getLocationOnScreen();
bot.mouseMove(pos.x + (component.getWidth() / 2), pos.y + (component.getHeight() / 2));
} catch (AWTException ex) {
ex.printStackTrace();
}
}
}
public class ActionHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton button = ((JButton)e.getSource());
System.out.println("Fired " + button.getText());
}
}
}