0

希望我能很好地解释这一点以使其有意义。

我的表弟被禁用并使用单个按钮来控制计算机上的应用程序。所有这些应用程序都是定制的,它们依赖于循环焦点和粗体突出显示的按钮。通过这样做,您只需在按钮突出显示时单击即可,这样就无需移动鼠标。

我目前正在为他制作一个小游戏,但我在聚焦部分遇到了障碍。我正在使用线程来循环焦点并LayoutButton.requestFocus();获得焦点。

如果按下空格键,这会起作用,但是他使用的按钮会按下鼠标左键。

有没有办法将按钮的焦点设置为鼠标左键?所以鼠标必须有效地指向按钮,所以当你点击鼠标时,按钮就会被按下。然后它必须取消该按钮的焦点并重新关注下一个按钮。有道理?

如果有人能指出我正确的方向,我将不胜感激。谢谢!

4

1 回答 1

1
  1. 确保您与 UI 的所有交互都是在事件调度线程的上下文中执行的
  2. 使用requestFocusInWindow代替requestFocus,requestFocus取决于系统,因此其功能未定义
  3. 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());
        }
    }

}
于 2012-11-27T06:19:25.243 回答