2013-04-23 49 views
0

我已經玩了OpenGL的幾個月和OS X上的C++過剩。我現在試圖使用OpenGL的Java(使用JOGL)但我無法弄清楚這個問題。在OS X上的Java輸入,沒有鍵重複,但與谷歌是

隨着過剩,如果我按下一個鍵並保持按下,glut會繼續接收事件,而我在輸出中看到的是一系列被按下的字母。 但是,使用JOGL,我無法得到這種行爲。相反,我只得到一個字母被按下。

我知道,在OS X上,這實際上是一個系統的事情,以防止關鍵重複,但那麼如何來過剩繞過呢?有沒有辦法通過JOGL獲得這種繞行?

我試過了,使用下面的代碼來獲得要重複的密鑰,但是當我按下一個按鍵時,一個單一的按鍵打印出現在我的終端上,而不是像一系列的過剩像過剩。

這是我到目前爲止已經試過

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提供的便攜性優勢。

編輯2:我試過使用lwjgl,並且我能夠獲得該庫的重複鍵行爲。雖然邏輯不同。使用lwjgl,我測試了if (Keyboard.isKeyDown(Keyboard.getEventKey())),然後爲每個關鍵字符做了一個switch case,與我習慣java的事件監聽和反應相反。我仍然想知道如何用JOGL做到這一點。

回答

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(NEWT GLWindow一個AWT應用程序內),然後執行一個NEWTKeyAdapter以接收自動重複按鍵事件。

使用NEWT實現的自動重複驗證可以在OSX上使用JogAmp JOGL TestNewtKeyEventAutoRepeatAWT單元測試進行工作。

如果仍然遇到NEWT任何問題,然後隨意提交錯誤報告與JogAmp團隊: http://jogamp.org/wiki/index.php/Jogl_FAQ#Bugreports_.26_Testing