2013-08-01 30 views
7

Java'da bir JPanel üzerinde anahtar bağlantıları yapmaya çalışıyorum. 'W' düğmesine bastığımda yürütmek için belirli bir eylem istiyorum. Bağlama yapmak için Java öğreticisini izlerim, ancak actionPerformed yöntemi yürütülmez (yani metin yazdırılmaz). İlgili bölümü ile benim test GUI için kod tamamı, vurgulanan şudur:Java Anahtar Bağlayıcılar Çalışmıyor

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();  
} 

} 

metin "test" basılmış asla. Birçok farklı varyantla, farklı tuşlarla birçok kez denedim ve panelin odakta olduğundan emin değilim, ama şansım yok. Neyi yanlış yapıyorum?

cevap

13

Sorun, KeyStroke modelini aradığınız yöntemdir. KeyStroke.getKeyStroke('w'), nedense bir önemli olayı tetiklemeyen typed w dönecektir. Bu yüzden bu yöntemden kaçınmaya eğilimliyim. Bunun yerine

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

veya

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

, sen daha güvenli olur

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)... 

gibi odak InputMap ilişkin sınırlamayı şey tanımlamak isteyebilirsiniz kullanmak ... ama ihtiyacınız olacak Hangi seviyede tetikleneceğini istediğiniz seviyeye karar vermek için

Bkz.Eğer ` 'w'` kullanıyorlardı fark etmedi

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

örnek ile güncellendi fazla ayrıntı

içinve How to use Key Bindings, sen' "w" 'kullandığını sanıyordum. Çalışma örneğiyle güncellendi – MadProgrammer

İlgili konular