0

所以,我们有一个应用结构如下:

在此处输入图像描述

在 EC_GUI 构造函数中,我初始化 glViewer

    private void initGlViewer() {
        /**
         * Viewer.
         */
        glViewer = new GLViewer();
        glViewer.setup();
        centerPanel.add(glViewer.getNewtCanvasAWT());
    }

glViewer 实现了 GLEventListener 并且如下

    public GLViewer() {

        GLProfile gLProfile = GLProfile.getDefault();

        GLCapabilities gLCapabilities = new GLCapabilities(gLProfile);

        glWindow = GLWindow.create(gLCapabilities);
        /*
         *  We combine NEWT GLWindow inside existing AWT application (the main JFrame) 
         *  by encapsulating the glWindow inside a NewtCanvasAWT canvas.
         */
        newtCanvasAWT = new NewtCanvasAWT(glWindow);
    }

在 glViewer.setup() 中,我将鼠标、键和 glEvent 侦听器添加到 glWindow。

我正在使用 com.jogamp.newt.event 中的键和鼠标事件。

我的 keyListener 中的 keyPressed 事件开始为:

@Override
    public synchronized void keyPressed(KeyEvent ke) {
        System.out.println("keyPressed " + ke.getKeyCode());

和 keyReleased 为好。

好吧,有时我在触发方面遇到不一致。以我按下组合ctrl+o打开fileChooser为例。

这是应该的:

keyPressed 17
List of pressed inputs
ctrl
keyPressed 79
List of pressed inputs
ctrl
o
keyReleased 17
keyReleased 79
2014.10.09, 10:53:49  [INFORMATION]  Open a project ...
2014.10.09, 10:53:49  [INFORMATION]  Opening file chooser for load.
2014.10.09, 10:53:55  [INFORMATION]  User clicked 'cancel' in file chooser dialog.

在这里您可以看到我按 ctrl (17),然后按 o (17),它们都被释放并显示 fileChooser。然后我退出,你可以在最后一行看到它。

但有时这就是我得到的:

keyPressed 17
List of pressed inputs
ctrl
keyPressed 79
List of pressed inputs
ctrl
o
keyReleased 17
2014.10.09, 10:57:34  [INFORMATION]  Open a project ...
2014.10.09, 10:57:34  [INFORMATION]  Opening file chooser for load.
2014.10.09, 10:57:35  [INFORMATION]  User clicked 'cancel' in file chooser dialog.
keyPressed 17
List of pressed inputs
ctrl
keyReleased 79
2014.10.09, 10:57:36  [INFORMATION]  Open a project ...
2014.10.09, 10:57:36  [INFORMATION]  Opening file chooser for load.
2014.10.09, 10:57:38  [INFORMATION]  User clicked 'cancel' in file chooser dialog.

我得到了 ctrl 和 o keyPressed,但我错过了其中一个 keyReleased,在这种情况下是 o。无论如何,fileChooser 仍然被打开。在下一次尝试中,我再次按下 ctrl+o,但这次我错过了按下的 o 键。我也想念 ctrl keyReleased。无论如何,fileChooser 仍然打开。但有时它不会打开,例如:

keyPressed 17
List of pressed inputs
ctrl
keyPressed 79
List of pressed inputs
ctrl
o
keyReleased 17
2014.10.09, 11:08:57  [INFORMATION]  Open a project ...
2014.10.09, 11:08:57  [INFORMATION]  Opening file chooser for load.
2014.10.09, 11:08:58  [INFORMATION]  User clicked 'cancel' in file chooser dialog.
keyPressed 17
List of pressed inputs
ctrl
keyReleased 79
2014.10.09, 11:08:59  [INFORMATION]  Open a project ...
2014.10.09, 11:08:59  [INFORMATION]  Opening file chooser for load.
2014.10.09, 11:09:02  [INFORMATION]  User clicked 'cancel' in file chooser dialog.
keyReleased 79
keyReleased 17
keyReleased 79

我得到 ctrl-keyPressed,o-keyPressed,ctrl-keyReleased,没有 o-keyReleased,fileChooser 打开,然后我关闭它。我再次按下它们,我得到 ctrl-keyPressed,没有 o-keyPressed,o-keyReleased,没有 ctrl-keyReleased,fileChooser 打开,然后我再次关闭它。我再次按 ctrl+o,我没有得到任何 keyPressed,我只是得到一个 o-keyReleased,一个 ctrl-keyReleased,然后是另一个 o-keyReleased。FileChooser 这次没有打开..

有什么线索吗?

4

1 回答 1

0

我通过在每个 keyPressed/keyReleased 事件中通过 KeyEvent.isXDown() 查询每个 X 修饰符来检查按下的修饰符来解决

于 2014-10-27T09:39:18.767 回答