-3

の配列がJButtonsあり、それらに を追加しActionListenerました。

それから私は入れますnew Thread(){ public void run(){} }.start();。現在の背景はJButton赤になり、3 秒後に白に変わり、配列内の次のボタンが赤くなります。

KeyEvent次に、 forを追加しSPACEます。アイデアは、背景が赤で入力SPACEすると、現在のボタンにフォーカスし、彼のアクションリスナーを実行する必要があるということです。3 秒後にSPACEもう一度入力すると、配列内の次のボタンを押す必要があります。

これには解決策が必要です。

4

1 に答える 1

1

この種のことは以前にも見たことがあります。間違いでなければ、無効なユーザーに機能を提供することです (そうでない場合は、以前に見たことがあります)。

まず第一に...決して、Threadイベントディスパッチスレッド以外のUIコンポーネントを作成/変更しないでください。実際、この質問については、実際にスレッドが必要であるとは思えません。

詳細については、Swing での同時実行を確認してください。

また、どちらのタイプも必要ありませんKeyListener。最悪の場合、Key Bindingを指定する必要があるかもしれませんが、ほとんどのルック アンド フィールでSpaceは、 のような「デフォルト」の受け入れアクションとしてサポートされていますEnter

本当にやりたいことは、代わりに強調表示されたボタンにフォーカスを移動することです。

public class TestHelpButton {

    public static void main(String[] args) {
        new TestHelpButton();
    }

    public TestHelpButton() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JButton[] buttons = new JButton[]{
            new JButton(new BasicAction("Don't Panic")),
            new JButton(new BasicAction("Panic")),
            new JButton(new BasicAction("Cup of Tea")),
            new JButton(new BasicAction("Destory the world")),};
        private int activeIndex = -1;

        public TestPane() {
            setLayout(new GridBagLayout());
            for (JButton btn : buttons) {
                add(btn);
            }

            updateSelection();

            Timer timer = new Timer(3000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    updateSelection();
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
        }

        protected void updateSelection() {
            if (activeIndex >= 0) {
                JButton btn = buttons[activeIndex];
                btn.setBackground(UIManager.getColor("Button.background"));
            }

            activeIndex++;
            if (activeIndex > buttons.length - 1) {
                activeIndex = 0;
            }
            JButton btn = buttons[activeIndex];
            btn.setBackground(Color.RED);
            btn.requestFocusInWindow();
        }
    }

    public class BasicAction extends AbstractAction {

        public BasicAction(String text) {
            putValue(NAME, text);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, getValue(NAME), "Helper", JOptionPane.INFORMATION_MESSAGE);
        }
    }
}

実際の例を提供している唯一の理由は、これが障害のあるユーザーに追加のサポートを提供することであるという私の仮定に基づいています。

于 2013-02-01T00:36:28.170 に答える