我已经玩了几个月的OpenGL和OS X上的C ++过剩。我现在正在尝试使用Java(使用JOGL)和OpenGL,但我无法弄清楚这个问题。
有了过剩,如果我按下一个键并保持按下,过剩会继续接收事件,而我在输出中看到的是一系列被按下的字母。 但是,使用JOGL,我无法得到这种行为。相反,我只得到一个字母被按下。
我知道在OS X上,这实际上是一个防止密钥重复的系统事情,但是那么过剩是如何绕过那个呢?有没有办法通过JOGL获得这种旁路?
我已经尝试过,使用下面的代码来获取要重复的密钥,但是当我按下一个键时,我的终端上会出现一个单独的密钥打印,而不是像过剩的那样。 / p>
这是我到目前为止所尝试的内容
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做到这一点。
答案 0 :(得分:1)
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