给按钮鼠标单击焦点

时间:2012-11-27 06:11:38

标签: java swing focus setfocus

希望我能够很好地解释这个问题。

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

我现在正在为他制作一个小游戏,我已经遇到了关注部分。我正在使用一个线程循环焦点,LayoutButton.requestFocus();来获得焦点。

如果按下空格键,则此方法有效,但是他使用的按钮会按下鼠标左键。

有没有办法将按钮的焦点设置为鼠标左键?因此鼠标必须有效地指向按钮,因此当您单击鼠标时按钮会按下。然后它必须将该按钮解除焦点并重新聚焦在下一个按钮上。合理?

如果有人能指出我正确的方向,我会很感激。谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 确保您与UI的所有交互都是在Event Dispatching Thread
  2. 的上下文中执行的
  3. 使用requestFocusInWindow代替requestFocusrequestFocus取决于系统,因此其功能未定义
  4. 您可以通过使用Robot课程将鼠标光标的位置更改为坐在按钮上。
  5. 您需要使用Component#getLocationOnScreenRobot#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());
            }
        }
    
    }