2012-06-17 5 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(); 
    } 
} 

Если кто-то может помочь мне, я был бы самым признательна. Спасибо.

EDIT: - Теперь я получаю эту ошибку.

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:

"Создать" клавиатуры. Сначала должен быть отображен экран. причина этого является то, так что клавиатура имеет окно в «фокус» в

EDIT: кажется, что вы не можете инициализировать их оба в то же самое время, так что попробуйте с таким подходом - крышка инициализации 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(); 
} 

(Добавить попытку/поймать, где это необходимо/требуется). Это помогло мне в кратчайшие сроки.

Смежные вопросы