2013-08-01 36 views
7

Próbuję utworzyć powiązania klawiszy w Javie na JPanel. Chcę wykonać określoną akcję po naciśnięciu przycisku "w". Postępuję zgodnie z samouczkiem Java dotyczącym tworzenia powiązań, ale metoda actionPerformed nie jest wykonywana (tzn. Tekst nie jest drukowany). Poniżej znajduje się całość kodu dla mojego testu GUI, z odpowiedniej części podkreślił:Wiązania kluczy Java nie działa

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

@SuppressWarnings("serial") 
public class Test extends JFrame{ 

private JPanel panel; 

public Test(){ 
    super(); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(500,500); 
    setLayout(new BorderLayout()); 
    setVisible(true);   
    panel = new JPanel(); 

    // HERE ARE THE KEY BINDINGS 
    panel.getInputMap().put(KeyStroke.getKeyStroke('w'),"forward"); 
    panel.getActionMap().put("forward", new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("test"); 
     } 
    }); 
    // END OF KEY BINDINGS 

    add(panel, BorderLayout.CENTER); 
} 

public static void main(String[] args){ 
    new Test();  
} 

} 

tekst „test” nigdy nie zostanie wydrukowany. Próbowałem wiele razy z wieloma różnymi wariantami, różnymi kluczami i upewniłem się, że panel jest ostry, ale bez powodzenia. Co ja robię źle?

Odpowiedz

13

Problem polega na sposobie, w jaki patrzysz na KeyStroke. KeyStroke.getKeyStroke('w') zwróci typed w, co z jakiegoś powodu nie powoduje zdarzenia klucza. Właśnie dlatego staram się unikać tej metody. Zamiast używać

panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward"); 

lub

panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward"); 

Również może chcesz zdefiniować ograniczenie ostrości dla InputMap, coś

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)... 

Byłoby bezpieczniej ... ale trzeba będzie aby zdecydować, na jakim poziomie chcesz wywołać naciśnięcia klawiszy od

Zobacz JComponent i How to use Key Bindings więcej szczegółów

aktualizowana o przykład

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test extends JFrame { 

    private JPanel panel; 

    public Test() { 
     super(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500, 500); 
     setLayout(new BorderLayout()); 
     setVisible(true); 
     panel = new JPanel(); 

     // HERE ARE THE KEY BINDINGS 
     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward"); 
     panel.getActionMap().put("forward", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("test"); 
      } 
     }); 
     // END OF KEY BINDINGS 

     add(panel, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       new Test(); 
      } 
     }); 
    } 
} 
+0

Nie zauważyłem uzywasz ' 'w'' pomyślał uzywasz' "w" '. Zaktualizowany na przykładzie roboczym – MadProgrammer