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());

そしてキーも解放されました。

時々、トリガーに関して矛盾が発生することがあります。例として、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 の 1 つ、この場合は o を見逃しています。とにかく、fileChooser は引き続き開かれます。次の試行でもう一度ctrl + oを押しますが、今回はo keyPressedを見逃しています。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

KeyEvent.isXDown() によって各 X 修飾子を照会することにより、すべての keyPressed/keyReleased イベントで押された修飾子をチェックすることで解決しました

于 2014-10-27T09:39:18.767 に答える