2014-06-20 38 views
1

我正在练习事件,并希望设置它,所以我有一个类既响应按钮和按键,它编译好,但关键事件不调用方法/工作在所有。关键事件不起作用

这是类:

class CircleListener extends KeyAdapter implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == nlrg_button) canvas.enlarge(); 
      else if (e.getSource() == shrink_button) canvas.shrink(); 
      else if (e.getSource() == superenlarger_button) canvas.enlargeAlot(); 
      else if (e.getSource() == supershrinker_button) canvas.shrinkAlot(); 

      repaint(); 
     } 
     @Override 
     public void keyPressed(KeyEvent e) { 
      switch(e.getKeyCode()){ 
       case KeyEvent.VK_DOWN: canvas.circleDown(); break; 
       case KeyEvent.VK_UP: canvas.circleUp(); break; 
       case KeyEvent.VK_LEFT: canvas.circleLeft(); break; 
       case KeyEvent.VK_RIGHT: canvas.circleRight(); break; 
      } 
      repaint(); 
     } 
    } 

这是实例+注册:

CircleListener listener = new CircleListener(); 

     // Bind buttons with respective eventlistener class 
     nlrg_button.addActionListener(listener); 
     shrink_button.addActionListener(listener); 
     superenlarger_button.addActionListener(listener); 
     supershrinker_button.addActionListener(listener); 
      // Bind canvas to keylistener class 
     canvas.addKeyListener(listener); 

他们试图调用存在和工作按预期的方式,我确信这样通过美其名曰询问前的按钮。

为什么它不工作/我错过了什么? &有更有效的形式吗?

+0

你可以发布完整的实例+注册码吗?看起来问题出在这个小片段之外...... –

回答

4

为什么它不工作/我错过了什么?

KeyEvents仅被分派到具有焦点的组件。由于面板上有很多组件,因此面板永远不会有焦点。你不应该为此使用KeyEvents。

我有这样的回应既按钮和按键

这是一个很好的设计类,但是你不应该使用这个的KeyEvent。相反,你应该使用Key Bindings

当您使用密钥绑定时,您可以在按钮和KeyStroke之间共享操作。请阅读How to Use Key Bindings的Swing教程中的部分以获取更多信息和示例。

使用Actions构建应用程序是一个很好的设计。该教程还有一个关于How to Use Action的部分,您应该看看。所有Swing组件都使用Actions和Key Bindings。您可以查看Key Bindings以了解Swing组件的默认绑定以及使用键绑定的一些示例代码。