2015-02-10 293 views
0

我一直在试图制作一个小程序,当用户按下某个键时打印消息,但它不会打印该消息。以下是我的代码:Keybindings not working - swing

public static void key() { 
    Main main = new Main(); 
    JFrame frame = new JFrame(); 
    JComponent component = frame.getRootPane(); 
    frame.getContentPane().add(main); 
    System.out.println("adad"); 

    Action test = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("w has been pressed"); 
     } 
    }; 
    component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"test"); 
    component.getActionMap().put("test", test); 

} 

没有错误,但按下“w”键时不会调用actionPerformed。我究竟做错了什么?我不知道这是否相关,但这里是主要的方法,也许我在这里做错了什么。

public static void main(String[] args) { 

    Main main = new Main(); 
    JFrame frame = new JFrame(); 
    frame.add(main); 
    frame.pack(); 
    frame.setTitle("Test"); 
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    frame.setLayout(new BorderLayout()); 
    key(); 
    frame.setVisible(true); 
    frame.add(frame, BorderLayout.CENTER); 
} 
+0

为了更好地帮助越早,张贴[MCVE](http://stackoverflow.com/help/ (最小完整可验证示例)或[SSCCE](http://www.sscce.org/)(简短的,独立的,正确的示例)。 – 2015-02-10 00:39:25

回答

2

你已经创建了一个第二帧这是不是在屏幕上,它的键绑定绑定上也可见......

正如我昨天所说,关键绑定必须通过组件注册其连接到(其连接到本地对等体之一)可显示组件才能工作

如果您尝试使用更多的东西一样......

public static void key(JComponent component) { 
    Action test = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("w has been pressed"); 
     } 
    }; 
    component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "test"); 
    component.getActionMap().put("test", test); 

} 

,并通过EIT的JFrame或它的一个她实例的子组件(如maincontentPane)从public static void main(...)方法,它应该工作

+0

终于!谢谢您的帮助。现在正常工作 – Ky6000 2015-02-10 00:50:54

+0

@ Ky6000现在你明白了一个[可运行的示例](https://stackoverflow.com/help/mcve)的重要性,它可以证明你的问题。这会减少混淆和更好的反应。我记得昨天看到的代码并没有确定'JComponent'的来源。您可以提供的环境越好,我们就可以更好地解决您的问题 – MadProgrammer 2015-02-10 00:53:08