我遇到了一个奇怪的问题。经过数小时的试用和错误,我发现问题的根源,但它对我没有任何意义。keyEvents冻结了键值,而其他方法可以在Java中正确调用相同的方法
我有一个主类,其具有以下的方法:
public static void test(){
System.out.println("test Method is called");
}
我有一个键类。 Keys的一个对象被添加到Main的一个对象中。
这里是最小完备可验证实施例: MAIN2类
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main2 extends JPanel {
private static Main2 main = new Main2();;
public static final Main2 main() {
return main;
}
public static void test() {
System.out.println("test Method is called");
}
public final JFrame frame = new JFrame();
public final Keys2 keys = new Keys2();
// ==============================================================
public static void main(String[] args) {}
private Main2() {
System.out.println("START");
Main2.main = this;
frameInit();
init();
gameLoop();
}
private void init() {
keys.start();
//keys.left(); Removing // from this line partially solves the problem.
}
private void frameInit() {
frame.add(main);
frame.setSize(100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void gameLoop() {
while (true) {// Removing while loop solves the problem
//Code here is omitted due to being irrelevant
}
}// loop end
}
密钥类别:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Keys2 implements KeyListener {
// Default keys will be able to be changed
private int leftKey = 37; // left b.
public void start() {
Main2.main().addKeyListener(this);
Main2.main().setFocusable(true);
}
public boolean isPressed(int keyCode) {
return false; // pressedKeys.contains(keyCode);
}
@Override
public void keyPressed(KeyEvent e) {
// non-critical keys:
System.out.println(e.getKeyCode());
if (e.getKeyCode() == leftKey)
left();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {}
// ========================================================
// KEY METHODS
public void left() {
// default left
System.out.println("left");
Main2.test();
System.out.println("end");
}
}// END OF THE KEYS CLASS
按下键打印的值。所以键正在工作。请注意,我已经改变了left()方法来调用Main类中的静态test()方法。现在,只要我不按左键是没有问题的,但是当我按下左我只得到在控制台以下结果:
left
既不是“结束”,也不是“测试方法被称为”是打印。没有错误消息。同样按下左键后,所有按键方法停止工作(游戏循环仍然有效,所以程序不会被冻结)。鼠标监听器也停止工作。我甚至无法通过单击X按钮来关闭JFrame窗口。
但是如果我叫左()方法从主或其他物体,甚至从start()方法的对象,它的工作原理没有错误和控制台得到以下信息:
left
test Method is called
end
之后,我可以毫不犹豫地按下左键并获得相同的信息。
这是什么原因?我怎样才能解决这个问题?
编辑:我已经取代我的代码有MCVE
1)为了更快地获得更好的帮助,请发布[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)或[SSCCE](http://www.sscce.org/) (简短,独立,正确的例子)。 2)对于Swing,我们通常使用[键绑定](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)而不是较低级别的'KeyListener'。 – 2014-11-22 09:08:10
@AndrewThompson我希望有一些明显的东西我不知道。我会尝试制作一个。 – WVrock 2014-11-22 09:31:18
什么是'Main.main()'?如果你想得到一个'Main'类型的对象,'Main mainObj = new Main();'有什么问题?而且,如果你想使它成为静态的,这种方法的首选命名约定是'getInstance()'。你的代码不完整。 – hfontanez 2014-11-22 10:00:34