我已经在 OS X 上使用 C++ 中的 OpenGL 和 glut 玩了几个月。我现在正在尝试将 Java(使用 JOGL)与 OpenGL 一起使用,但我无法弄清楚这个问题。
对于 glut,如果我按下一个键并按住它,glut 将继续接收事件,我在输出中看到的是一系列被按下的字母。但是,使用 JOGL,我无法获得这种行为。相反,我只收到一封信。
我知道在 OS X 上,这实际上是防止密钥重复的系统问题,但是 glut 怎么会绕过它呢?有没有办法通过 JOGL 绕过这种方式?
我已经尝试使用以下代码来重复键,但是当我按下一个键时,我的终端上会出现一个键的打印,而不是像 glut 那样的一系列打印。
这是我到目前为止尝试过的
class keyTest implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent arg0) {
// TODO Auto-generated method stub
System.out.println("dada "+arg0.getKeyChar());
return false;
}
}
KeyboardFocusManager man = KeyboardFocusManager.getCurrentKeyboardFocusManager();
man.addKeyEventDispatcher(new keyTest());
我也试过
glcanvas.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
System.out.println("keypressed: "+arg0.getKeyChar());
}
});
具有相同的不良行为:仅打印一个键,而不是一系列键。
编辑:我在 OS X 的终端中看到了一些终端命令来禁用自动重复块,但这会破坏 java 提供的可移植性优势。
EDIT2:我尝试使用 lwjgl,并且我能够使用该库获得重复的键行为。不过逻辑不一样。使用 lwjgl,我测试if (Keyboard.isKeyDown(Keyboard.getEventKey()))
然后为每个关键字符做了一个 switch case,这与我习惯使用 java 的事件监听和反应相反。我仍然想知道如何用 JOGL 做到这一点。