2016-04-28 64 views
0

虽然我已经编写了很长一段时间,我似乎无法通过我遇到的这个问题(我几乎肯定它的一个小的语法错误,我无法捕捉的地方,而不是一个逻辑错误)。我正在制作一个声卡,并在键盘上使用数字键盘。我有一个的KeyManager类:问题KeyListener不工作

public class KeyManager implements KeyListener{ 


private boolean[] keys; 
private boolean nine, eight, seven, six, five, four, three, two, one; 

public KeyManager(){ 
    keys = new boolean [256]; 
} 

public void update(){ 
    nine = keys[KeyEvent.VK_9]; 
    eight = keys[KeyEvent.VK_8]; 
    seven = keys[KeyEvent.VK_7]; 
    six = keys[KeyEvent.VK_6]; 
    five = keys[KeyEvent.VK_5]; 
    four = keys[KeyEvent.VK_4]; 
    three = keys[KeyEvent.VK_3]; 
    two = keys[KeyEvent.VK_2]; 
    one = keys[KeyEvent.VK_1]; 
} 



public void keyPressed(KeyEvent e) { 
    keys[e.getKeyCode()] = true; 
} 

public void keyReleased(KeyEvent e) { 
    keys[e.getKeyCode()] = false; 
} 

public void keyTyped(KeyEvent e) { 

} 
public boolean isNine() { 
    return nine; 
} 

public boolean isEight() { 
    return eight; 
} 

public boolean isSeven() { 
    return seven; 
} 

public boolean isSix() { 
    return six; 
} 

public boolean isFive() { 
    return five; 
} 

public boolean isFour() { 
    return four; 
} 

public boolean isThree() { 
    return three; 
} 

public boolean isTwo() { 
    return two; 
} 

public boolean isOne() { 
    return one; 
} 
} 

这是很简单的,和我使用一个扩展的JFrame作为主UI显示一个Frame类:

public class Frame extends JFrame implements Runnable{ 
private static final long serialVersionUID = 1L; 
private Pane pane; 
private ArrayList<Circle> c; 
private KeyManager keyManager; 

public Frame(){ 
    keyManager = new KeyManager(); 
    this.addKeyListener(keyManager); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.getContentPane().setPreferredSize(new Dimension(400, 400)); 
    this.pack(); 
    this.setLocationRelativeTo(null); 
    pane = new Pane(); 
    this.add(pane); 
    c = new ArrayList<Circle>(); 
    c.add(new Circle(20, 140)); 
    c.add(new Circle(80, 140)); 
    c.add(new Circle(140, 140)); 
    c.add(new Circle(20, 80)); 
    c.add(new Circle(80, 80)); 
    c.add(new Circle(140, 80)); 
    c.add(new Circle(20, 20)); 
    c.add(new Circle(80, 20)); 
    c.add(new Circle(140, 20)); 
    this.setVisible(true); 
} 

public void init(){ 
    pane.draw(c); 
} 

public void update(){ 
    pane.draw(c); 
    keyManager.update(); 
    if(keyManager.isNine()){ 
     System.out.println("pressed"); 
     c.get(8).press(); 
    } 
    else{ 
     c.get(8).release(); 
     System.out.println("unpressed"); 
    } 
} 


public void run() { 

    init(); 

    int fps = 60; 
    double timePerUpdate = 1000000000/fps; 
    double delta = 0; 
    long now; 
    long lastTime= System.nanoTime(); 
    long timer = 0; 
    int updates = 0; 

    while(true){ 
     now = System.nanoTime(); 
     delta += (now - lastTime)/timePerUpdate; 
     timer+= now - lastTime; 
     lastTime = now; 

     if(delta >= 1){ 
      update(); 
      updates ++; 
      delta--; 
     } 

     if(timer >= 1000000000){ 
      //System.out.println("Updates and Frames: "+ updates); 
      updates = 0; 
      timer = 0; 
     } 

    } 
} 


} 

出于某种原因,当我按下“9”在我的键盘上,它不会在Frame.update()方法中打印出来,但只会打印出“未压缩”。我失去了什么导致这个问题。这是我第一次使用KeyManager类,而不是让Frame完成所有提升,因为它是很好的编程练习,但从逻辑上讲,它应该工作,除非我失去了一些东西...

回答

1

它看起来没有就像你注册你的密钥管理器一样。 JFrame如何知道它有一个关键侦听器?

在你的框架类this.addKeyListener(new KeyManager());

的最顶端加入这行代码如下所示:

public Frame(){ 
    this.addKeyListener(new KeyManager()); // New code 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.getContentPane().setPreferredSize(new Dimension(400, 400)); 

编辑:以供将来参考经常检查的javadoc,因为在这种情况下,答案是有为您提供:

该类创建的侦听器对象,然后使用组件的一个 组件注册addKeyListener方法。

的Javadoc: https://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyListener.html

并再次addKeyListener在官方教程中提到:

https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

编辑发表评论:

通过添加一些代码来让调试问题您的按键事件。通过这样做,我们可以找到几件事情。

1)关键事件是否被解雇?

2)什么是被按压

public void keyPressed(KeyEvent e) { 
    System.out.println("The following key was pressed: "+e.getKeyChar()); 
    System.out.println("With the following key code: "+e.getKeyCode()); 
    System.out.println("Is that the expected output?"); 
    keys[e.getKeyCode()] = true; 
} 

你得到正确的输出,形成我们新的调试代码的关键代码和焦炭?键码是否正确,字符是否正确?你的其他数字键是否工作?

这里要记住的一件事是,编号板数字与正常数字键具有不同的键码。我强烈建议您重写代码以使用e.getKeyChar()或在update()方法中包含数字键盘键码,并在按下正常键盘或数字键盘键并将布尔值设置为true/false时使用IF语句。

+0

感谢您的帮助。我没有意识到我删除了该行,而不是将其从addKeyListener(this)更改为此。addKeyListener(keyManager)(正如我最初在框架中实现keyListener),但仍然无法正常工作。同样的问题。 – Dak31

+0

好吧,现在听众正在工作,我们需要调试一个按键。看到我编辑上面显示你需要做的事情。 – sorifiend

+0

我使用的是9代码而不是数字键,这就是问题所在。再次感谢您的帮助 – Dak31