2012-10-20 58 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中所述,您需要將模型設置爲武裝並按下才能在按鈕中模擬鼠標。