0

我已经在 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 做到这一点。

4

1 回答 1

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 以接收自动重复键事件。

使用 NEWT 实现的自动重复已使用 JogAmp JOGL TestNewtKeyEventAutoRepeatAWT 单元测试在 OSX 上进行验证。

如果您仍然遇到任何 NEWT 问题,请随时向 JogAmp 团队提交错误报告:http: //jogamp.org/wiki/index.php/Jogl_FAQ#Bugreports_.26_Testing

于 2013-04-30T11:06:01.477 回答