0

うまくいけば、これを十分に説明して意味をなすことができます。

私のいとこは体が不自由で、1 つのボタンを使用してコンピューター上のアプリケーションを制御していました。これらのアプリケーションはすべてカスタムメイドであり、フォーカスとハイライトを太字で切り替えるボタンに依存しています。これにより、ボタンが強調表示されているときにクリックするだけで済み、マウスを動かす必要がなくなります。

私は現在彼のために小さなゲームを作っていますが、フォーカシングの部分で問題が発生しました。スレッドを使用してフォーカスを循環させ、フォーカス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);
}

例で更新

さて、これが実用的な例です。これにはタイマーが組み込まれており、次のフォーカス可能なコンポーネントに簡単に移動できます。

マウスを各ボタンの中央に移動するフォーカス コンポーネントを各ボタンにアタッチしました。

これは、タイマーが次のコンポーネントに移動するかタブを押すことを許可できることを意味し、同じ結果が得られるはずです

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 に答える