虽然我已经编写了很长一段时间,我似乎无法通过我遇到的这个问题(我几乎肯定它的一个小的语法错误,我无法捕捉的地方,而不是一个逻辑错误)。我正在制作一个声卡,并在键盘上使用数字键盘。我有一个的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完成所有提升,因为它是很好的编程练习,但从逻辑上讲,它应该工作,除非我失去了一些东西...
感谢您的帮助。我没有意识到我删除了该行,而不是将其从addKeyListener(this)更改为此。addKeyListener(keyManager)(正如我最初在框架中实现keyListener),但仍然无法正常工作。同样的问题。 – Dak31
好吧,现在听众正在工作,我们需要调试一个按键。看到我编辑上面显示你需要做的事情。 – sorifiend
我使用的是9代码而不是数字键,这就是问题所在。再次感谢您的帮助 – Dak31