OS X上的Java输入,没有键重复,但是有了过剩

时间:2013-04-23 03:54:38

标签: java macos opengl glut jogl

我已经玩了几个月的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做到这一点。

1 个答案:

答案 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