この種のことは以前にも見たことがあります。間違いでなければ、無効なユーザーに機能を提供することです (そうでない場合は、以前に見たことがあります)。
まず第一に...決して、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);
}
}
}
実際の例を提供している唯一の理由は、これが障害のあるユーザーに追加のサポートを提供することであるという私の仮定に基づいています。