2014-06-20 40 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組件的默認綁定以及使用鍵綁定的一些示例代碼。