2012-09-08 31 views
1

我有四个单选按钮,它们都是RadioGroup的一部分。如何将热键链接到每个按钮?我想要做的是将键'1','2','3'和'4'链接到每个相应的单选按钮。如何将热键链接到java中的按钮?

buttonGroup1 = new javax.swing.ButtonGroup(); 
quizBut1 = new javax.swing.JRadioButton(); 
quizBut2 = new javax.swing.JRadioButton(); 
quizBut4 = new javax.swing.JRadioButton(); 
quizBut3 = new javax.swing.JRadioButton(); 

回答

4

使用KeyListener - 您可以将它们附加到Swing中的任何组件。

你可能要做的是将KeyListener附加到应用程序中的主JFrame中以捕获所有按键,并根据按下的按键,相应地触发UI中的更改(例如,选择给定单选按钮)。

将KeyListener附加到几乎总是有keybaord焦点的容器是很重要的。在这种情况下,您不能将KeyListener附加到单选按钮本身,因为KeyListeners只能看到它们有焦点的事件。当一个KeyEvent没有被给定的对象吸收时,KeyEvent会被传递给它的父组件,以查看它是否想对事件做任何事情,并一直到应用程序的窗口。如果没有KeyListener对事件做任何事情,并且已经一直走到组件层次结构的根目录,那么在响应按键时就没有任何反应,并且事件基本上被丢弃。

+0

没有,KeyListener的是错误的做法(因为有可用的更高的抽象)在Swing - 使用的按键组合,而不是 – kleopatra

3

以及,您可以使用ActionMapKeyStroke。一些粗糙的片段,修改它:

class KeyAction extends AbstractAction { 
     JRadioButton b; 
     KeyAction(JRadioButton b) { 
      super(); 
      this.b = b; 
     } 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      b.setSelected(true); 
     } 
    } 

    b1.setAction(new KeyAction(b1)); 
    b2.setAction(new KeyAction(b2)); 
    b3.setAction(new KeyAction(b3)); 

    bindHotkey('1', "1", b1.getAction()); 
    bindHotkey('2', "2", b2.getAction()); 
    bindHotkey('3', "3", b3.getAction()); 
      .............. 

void bindHotkey(char keyChar, String name, Action action) { 
    KeyStroke ks = KeyStroke.getKeyStroke(keyChar); 
    container.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, name); 
    container.getActionMap().put(name, action); 
} 
+1

+1伟大,正确的答案,另一种选择是Action(听众) – mKorbel