我已经在OS X的C ++中使用OpenGL和glut进行了几个月的训练。我现在正尝试将Java(使用JOGL)与OpenGL配合使用,但是我无法弄清楚这个问题。
使用glut时,如果我按下一个键并保持按下状态,glut将继续接收事件,并且我在输出中看到的是一系列被按下的字母。
但是,使用JOGL,我无法获得该行为。相反,我只收到一封信。
我知道在OS X上,这实际上是防止重复输入的系统操作,但是过剩怎么会绕过呢?有没有办法让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()))
,然后为每个关键字符做了一个切换例,这与我以前使用Java进行事件监听和反应相反。我仍然想知道如何使用JOGL。 最佳答案
AWT输入取决于您的JVM供应商AWT实现。
使用AWT输入进行键重复操作时遇到的任何问题都必须向您的JRE / JDK供应商提出。
JogAmp JOGL开发人员建议您使用NEWT输入和窗口工具包来处理JOGL应用程序的键输入,NEWT还可让您的应用程序扩展到没有AWT的系统。由于NEWT句柄输入直接允许您的应用程序输入系统在整个系统上工作相同。
http://jogamp.org/jogl/doc/NEWT-Overview.html
您可以从使用GLCanvas(AWT)直接使用GLWindow(NEWT)或使用NewtCanvasAWT(AWT应用程序内部的NEWT GLWindow)切换,然后实现NEWTKeyAdapter来接收自动重复键事件。
使用JogAmp JOGL TestNewtKeyEventAutoRepeatAWT单元测试,已验证使用NEWT实现的自动重复可以在OSX上运行。
如果您仍然遇到NEWT的任何问题,请随时向JogAmp团队提交错误报告:
http://jogamp.org/wiki/index.php/Jogl_FAQ#Bugreports_.26_Testing