2012-10-20 223 views
5

我正在使用包含箭头键的GUI使用Swing制作Java程序。箭头键对应于键盘上的箭头键。Java Swing:使用相应的键盘按钮时显示按下按钮

当我按下键盘上的向上箭头键时,我想让GUI上的向上箭头键显示为正在按下。在我释放箭头键之前,它应该显示它仍然被按下,并且在释放时它也应该释放。

按下至今(仅适用于向上按钮),我的代码片段,我认为这是在表演完全错误的类别:

... 
if (e.getKeyCode() == KeyEvent.VK_UP) { 
        actionArrowUp(); 
        JButton buttonUp = (JButton) mainTab.getComponent(4); 
        buttonUp.setSelected(true); 
       } 
... 
@Override 
public void keyReleased(KeyEvent e) { 
      if (e.getKeyCode() == KeyEvent.VK_UP) 
       actionArrowUpRelease(); 
       buttonUp.setSelected(true); 
+1

是的,我的道歉。通常当我收到一个可用的答案时,我有点太仓促和风暴来利用它。我为此道歉。 – Sven

+2

1)也许考虑[Key Bindings](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。 2)为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 3)请好好打听那个其他事情。 :) –

回答

4

使用keyBindings(作为@trashgod已经提到)是的方式。为了得到完全相同的视觉行为仿佛空间激活按钮/输入(当它是重点)

  • 实施的行动是委托/发布
  • 需要结合两种按下按下注册按钮的默认操作和释放的键来模拟
  • 安装绑定到按钮的父在其类型的InputMap WHEN_ANCESTOR

在代码:

// the delegating action 
public static class SimulateButtonAction extends AbstractAction { 

    AbstractButton button; 

    public SimulateButtonAction(AbstractButton model, String fire) { 
     super(fire); 
     this.button = model; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Action delegate = button.getActionMap().get(getName()); 
     delegate.actionPerformed(new ActionEvent(button, 
       ActionEvent.ACTION_PERFORMED, getName())); 
    } 

    public String getName() { 
     return (String) getValue(Action.NAME); 
    } 

} 

// example usage 
JComponent content = new JPanel(new GridLayout(0, 5)); 
Action log = new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("triggered: " + ((AbstractButton) e.getSource()).getText()); 
    } 

}; 
String pressed = "pressed"; 
String released = "released"; 
ActionMap actionMap = content.getActionMap(); 
InputMap inputMap = content.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
String[] arrows = {"UP", "DOWN", "LEFT", "RIGHT"}; 
for (int i = 0; i < arrows.length; i++) { 
    JButton button = new JButton(log); 
    button.setAction(log); 
    button.setText(arrows[i]); 
    content.add(button); 
    // simulate pressed 
    String pressedKey = pressed + arrows[i]; 
    inputMap.put(KeyStroke.getKeyStroke(arrows[i]), pressedKey); 
    actionMap.put(pressedKey, new SimulateButtonAction(button, pressed)); 
    String releasedKey = released + arrows[i]; 
    inputMap.put(KeyStroke.getKeyStroke(released + " " +arrows[i]), releasedKey); 
    actionMap.put(releasedKey, new SimulateButtonAction(button, released)); 
} 
+0

+1,用于委派,避免了直接操作按钮的模型。 – trashgod

4

LinePanel使用Key Bindings,并调用actionPerformed()doClick()实现这与您所描述的效果类似。

附录:正如你希望按钮显示为按下而键按下,您可以使用的KeyStroke.getKeyStroke()可选onKeyReleased参数。如ButtonModel中所述,您需要将模型设置为武装并按下才能在按钮中模拟鼠标。