2012-10-20 15 views
5

Tworzę program w Javie, używając Swing, z graficznym interfejsem użytkownika, który zawiera klawisze strzałek. Klawisze strzałek odpowiadają klawiszom strzałek na klawiaturze.Java Swing: Pokaż naciśnięty przycisk przy użyciu odpowiedniego przycisku klawiatury

Po naciśnięciu klawisza strzałki w górę na klawiaturze, chciałbym, aby strzałka w górę na GUI pojawiła się jako naciśnięcie. Dopóki nie zwolnię klawisza ze strzałką, powinien pokazać, że wciąż jest wciśnięty, a po zwolnieniu powinien również zwolnić.

fragment mojego kodu do tej pory (tylko za pomocą przycisku w górę), co moim zdaniem jest całkowicie błędne w show jest wciśnięty kategoria:

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

Tak, oczywiście, moje przeprosiny. Często, gdy otrzymuję użyteczną odpowiedź, jestem trochę zbyt pospiesznie i burza, aby ją wykorzystać. Przepraszam za to. – Sven

+2

1) Być może warto rozważyć [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html). 2) Aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). 3) Dobre wezwanie do zajmowania się tą inną sprawą. :) –

Odpowiedz

4

Korzystanie z keyBindings (jak już wspomniano @trash) jest z drogą. Aby uzyskać dokładne samo zachowanie wizualnej jakby aktywacji przycisku przez przestrzeń/ENTER (kiedy to było skoncentrowane)

  • wdrożyć działania, które przenoszą na domyślnych działań przycisk zarejestrowanych dla wciśnięty/odblokowania
  • potrzeb wiążących się zarówno wciśnięty i wydany klucza do symulacji
  • zainstalować wiązanie rodzica przyciskom: w jego inputMap typu WHEN_ANCESTOR

w kodzie:

// 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 za delegację, dzięki czemu nie trzeba bezpośrednio manipulować modelem przycisku. – trashgod

4

Ten LinePanel wykorzystuje Key Bindings i wywołuje doClick() w actionPerformed() osiągnąć efekt podobny do tego, który opisujesz.

Uzupełnienie: Jak chcesz, aby pojawiają wciśnięty podczas przycisk jest wciśnięty, może być w stanie korzystać z opcjonalnego onKeyReleased parametr KeyStroke.getKeyStroke(). Jak opisano w ButtonModel, musisz uzbroić i nacisnąć model, aby symulować naciśnięcie przycisku myszy.

Powiązane problemy