2012-06-17 53 views
0

我需要您的幫助。 我一直得到這個例外: -我在使用LWJGL中的鍵盤時遇到此錯誤

Exception in thread "main" java.lang.IllegalStateException: Keyboard must be created before you can read events 
    at org.lwjgl.input.Keyboard.next(Keyboard.java:467) 
    at oregon.src.Controller.<init>(Controller.java:15) 
    at oregon.client.Oregon.start(Oregon.java:19) 
    at oregon.client.Oregon.main(Oregon.java:84) 

我不知道如何解決它。我之前發佈了一個問題,有人幫助我,但隨後引發了這個問題。 這裏是爲(oregon.src.Controller)代碼:

package oregon.src; 

import oregon.client.Oregon; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.opengl.Display; 

public class Controller { 
    public Oregon oregon; 

    public Controller(Oregon oregon) throws LWJGLException { 
     this.oregon = oregon; 

     while (Keyboard.next()) { 
      if (Keyboard.getEventKeyState()) { 
       if (Keyboard.getEventKey() == Keyboard.KEY_F11) { 
        oregon.setFullscreen(); 
       } 
      } 
     } 
    } 
} 

下面是(oregon.client.Oregon)代碼:

package oregon.client; 

import oregon.src.Controller; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

public class Oregon { 
    public static DisplayMode normal = new DisplayMode(640, 640); 

    public Controller controller; 

    public static boolean fullscreen = false; 

    public void start() { 
     try { 
      controller = new Controller(this); 
     } catch (LWJGLException e1) { 
      e1.printStackTrace(); 
     } 

     try { 
      create(); 
     } catch (LWJGLException e) { 
      stop(e); 
     } 

     while (!Display.isCloseRequested()) { 
      events(); 
      Display.update(); 
     } 

     Display.destroy(); 
    } 

    public void events() { 
     try { 
      new Controller(this); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void setFullscreen() { 
     try { 
      if (!fullscreen) { 
       Display.setFullscreen(true); 
       fullscreen = true; 
      } else if (fullscreen) { 
       Display.setDisplayMode(normal); 
       fullscreen = false; 
      } 
     } catch (LWJGLException e) { 
      stop(e); 
     } 
    } 

    public static void create() throws LWJGLException {   
     if (fullscreen) { 
      Display.setFullscreen(true); 
     } else if (!fullscreen) { 
      Display.setDisplayMode(normal); 
     } 

     Keyboard.create(); 
     Display.create(); 
    } 

    public void stop() { 
     System.exit(0); 
     Display.destroy(); 
    } 

    public void stop(Exception e) { 
     e.printStackTrace(); 
     System.exit(0); 
     Display.destroy(); 
    } 

    public static void main(String args[]) { 
     Oregon oregon = new Oregon(); 
     oregon.start(); 
    } 
} 

如果有人可以幫助我,我將是最感激。 謝謝。

編輯: - 現在我收到此錯誤。

Exception in thread "main" java.lang.IllegalStateException: Display must be created. 
at org.lwjgl.input.Keyboard.create(Keyboard.java:319) 
at oregon.src.Controller.<init>(Controller.java:19) 
at oregon.client.Oregon.start(Oregon.java:19) 
at oregon.client.Oregon.main(Oregon.java:84) 

回答

3

由於錯誤說 - 你需要創建keyboard

public Controller(Oregon oregon) throws LWJGLException { 
     this.oregon = oregon; 


     Keyboard.create(); // <- add this here. 

     while (Keyboard.next()) { 
      if (Keyboard.getEventKeyState()) { 
       if (Keyboard.getEventKey() == Keyboard.KEY_F11) { 
        oregon.setFullscreen(); 
       } 
      } 
     } 
    } 

API

「創建」 鍵盤。顯示必須首先被創建。該 原因是這樣的鍵盤在一個窗口中的「焦點」

編輯:好像你不能在同一時間初始化他們兩個,所以用這種方法嘗試 - 蓋初始化Keyboard。如果聲明:

if (!Keyboard.isCreated() && !getPrivilegedBoolean("org.lwjgl.opengl.Display.nokeyboard")) { 
       try { 
        Keyboard.create(); 
       } catch (LWJGLException e) { 
        if (LWJGLUtil.DEBUG) { 
         e.printStackTrace(System.err); 
        } else { 
         LWJGLUtil.log("Failed to create Keyboard: " + e); 
        } 
       } 
      } 

Here is posted similar source code, that seems to be working fine.

+0

我現在就試試。 –

+0

現在我得到一個IllegalStateException。請幫助!對不起,忘了之後的文字。 「任何時候只能有一個LWJGL上下文實例化。」 –

+0

@泰勒金,我無法在你的腦海裏讀到。在問題編輯中發佈固定代碼和堆棧跟蹤。 – dantuch

0

如果你想防止錯誤,初始化並在這樣的主函數創建顯示:

public static void main(String args[]) { 
    Display.setDisplayMode(new DisplayMode(800, 600)); 
    Display.create(); 
    Oregon oregon = new Oregon(); 
    oregon.start(); 
} 

(在需要/想要的地方添加try/catch)。這在我的快速測試中奏效。

相關問題