2012-10-20 8 views
5

Ich mache ein Programm in Java mit Swing, mit einer GUI, die Pfeiltasten enthält. Die Pfeiltasten entsprechen den Pfeiltasten auf der Tastatur.Java Swing: Gedrückte Schaltfläche anzeigen, wenn entsprechende Tastaturtaste verwendet wird

Wenn ich die Aufwärtspfeiltaste auf der Tastatur drücke, möchte ich, dass die Nach-oben-Taste auf der Benutzeroberfläche als gedrückt angezeigt wird. Bis ich die Pfeiltaste loslasse, sollte es zeigen, dass es noch gedrückt wird, und wenn es freigegeben wird, sollte es auch freigeben.

Ein Ausschnitt aus meinem Code so weit (nur für die Up-Taste), die ich glaube, völlig falsch in der Show ist gedrückt Kategorie:

... 
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

Ja natürlich, meine Entschuldigung. Oft, wenn ich eine brauchbare Antwort bekomme, bin ich ein bisschen zu hastig und stürme davon, es zu nutzen. Ich entschuldige mich dafür. – Sven

+2

1) Vielleicht in Betracht ziehen [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) dafür. 2) Für bessere Hilfe, post ein [SSCCE] (http://sscce.org/). 3) Gute Aufforderung, sich um diese andere Angelegenheit zu kümmern. :) –

Antwort

4

Mit keyBindings (wie @trashgod bereits erwähnt) ist der Weg zu gehen. Um genau die gleiche visuelle Verhalten zu bekommen wie von Raum Betätigen der Schaltfläche/eingeben (wenn es konzentriert waren)

  • Aktionen implementieren, die Delegierten auf die für gedrückt registrierten Standardaktionen der Schaltfläche/freigegeben
  • Bedürfnisse Bindung an beide gedrückt und der Schlüssel freigegeben zu simulieren
  • installieren Sie die Bindung an die Eltern Tasten in seiner inputMap vom Typ WHEN_ANCESTOR

in Code:

// 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 für Delegierung, die vermeidet, das Button-Modell direkt zu manipulieren. – trashgod

4

Diese LinePanelKey Bindings verwendet und ruft doClick() in actionPerformed() zu erreichen ein Effekt ähnlich dem, den du beschreibst.

Nachtrag: Wie Sie die Taste erscheint gedrückt wollen, während die Taste gedrückt ist, können Sie in der Lage sein, die optional onKeyReleased Parameter von KeyStroke.getKeyStroke() zu verwenden. Wie in ButtonModel beschrieben, müssen Sie das Modell aktivieren und drücken, um eine Maus in der Taste zu simulieren.