2012-10-12 43 views
0

大家好我是Java的新手,所以我認爲這個問題的答案很簡單,但是我找不到我在做什麼錯誤..我爲我的pacman遊戲添加了一個keyListener,但不知何故它不會工作..我用下面的代碼:Java中的KeyListener

package h04PacMan; 

import java.awt.event.*; 

import javax.swing.*; 

public class PacManBediening extends JPanel implements ActionListener, KeyListener { 

private JButton links, rechts, boven, beneden; 
PacMan pacman; 

public PacManBediening(PacMan pacman) { 

    this.pacman = pacman; 

    links = new JButton("<"); 
    links.addActionListener(this); 
    add(links); 

    rechts = new JButton(">"); 
    rechts.addActionListener(this); 
    add(rechts); 

    boven = new JButton("^"); 
    boven.addActionListener(this); 
    add(boven); 

    beneden = new JButton("v"); 
    beneden.addActionListener(this); 
    add(beneden); 

} 

/* 
* bediening bij een klik 
*/ 

@Override 
public void actionPerformed(ActionEvent e) { 

    if(e.getSource() == links) { 

     pacman.setRichtingEnSnelheid(-10); 
     pacman.setBesturing(0); 
     pacman.setView(180); 
     //System.out.println("links"); 
    } 
    else if(e.getSource() == rechts) { 
     pacman.setRichtingEnSnelheid(+10); 
     pacman.setBesturing(0); 
     pacman.setView(0); 
     //System.out.println("rechts"); 
    } 
    else if(e.getSource() == boven) { 
     pacman.setRichtingEnSnelheid(-10); 
     pacman.setBesturing(1); 
     pacman.setView(90); 
     //System.out.println("boven"); 
    } 
    else { 
     pacman.setRichtingEnSnelheid(+10); 
     pacman.setBesturing(1); 
     pacman.setView(270); 
     //System.out.println("beneden"); 
    } 


} 

@Override 
public void keyPressed(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if(key == KeyEvent.VK_LEFT) { 
     pacman.setRichtingEnSnelheid(-10); 
     pacman.setBesturing(0); 
     pacman.setView(180); 
     System.out.println("links"); 
    } 
    else if(key == KeyEvent.VK_RIGHT) { 
     pacman.setRichtingEnSnelheid(+10); 
     pacman.setBesturing(0); 
     pacman.setView(0); 
     System.out.println("rechts"); 
    } 
    else if(key == KeyEvent.VK_UP) { 
     pacman.setRichtingEnSnelheid(-10); 
     pacman.setBesturing(1); 
     pacman.setView(90); 
     System.out.println("boven"); 
    } 
    else if(key == KeyEvent.VK_DOWN) { 
     pacman.setRichtingEnSnelheid(+10); 
     pacman.setBesturing(1); 
     pacman.setView(270); 
     System.out.println("beneden"); 
    } 

} 

@Override 
public void keyReleased(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyTyped(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

} 

有人可以告訴我要添加什麼或做不同?

+0

好,如果我用我的箭頭控制什麼也沒發生,我也沒有看到system.out.prinln我在控件下編寫的,所以整個方法都不叫我想我 – Reshad

+2

我只能猜測。您需要將密鑰偵聽器添加到具有焦點的組件,否則該事件不會觸發。 – jjnguy

回答

2

您的PacManBediening構造函數中缺少幾行代碼。

this.pacman = pacman; 
this.setFocusable(true); 
this.addKeyListener(this); 
+0

非常感謝這是我錯過的路線! – Reshad

2
  • KeyListener不指定Swing JComponents,我就不會這樣,

  • 我覺得這是簡單,可能失去了Focus從可聚焦JComponents

  • 使用KeyBindings作爲最可行的解決方法,而不是"catching or hunting for Focus"對於KeyListener

  • Swing JComponents都是內部short_cuts,快捷鍵,BUILT_IN方法,通知,基於KeyBindings

  • code example

+0

正如我剛纔提到的,我是Java新手,所以我只是通過創建這個pacman遊戲來嘗試一些東西。我遇到了KeyListener的問題,並且看了一下代碼示例,但我無法理解代碼中的所有內容,所以我不知道它的作用或哪些部分相關。:( – Reshad

+0

@Reshad沒有問題,你也不親自,我的答案在這裏是--->'有人可以告訴我要添加或做什麼不同嗎?' – mKorbel

+0

啊我明白了!:)我會嘗試重新設計我的代碼以使用keyBindings,但可以不承諾會有效果! – Reshad