2014-02-06 7 views
0

JOGL로 게임을 만들고 있는데 내 인생에서 할 수없는 오류가 발생했습니다. 알아 낸다.JOGL : javax.media.opengl.GLException : AWT-EventQueue-0 : 컨텍스트가 현재 스레드가 아닙니다.

게임에서 나는 메뉴와 실제 게임을위한 두 개의 GLCanvases (실제로 GLJpanels)를 사용하고 있습니다. 메뉴에서 게임을 시작하면 메뉴 GLCanvas가 gamewindow에서 제거되고 GLCanvas 게임으로 교체됩니다. 지금까지 거의 완벽하게 작동하는 메뉴를 오긴했는데,하지만 난 게임을 캔버스로 전환을 시도 할 때마다,이 오류가 얻을 :

Catched Exception on thread AWT-EventQueue-0 
javax.media.opengl.GLException: AWT-EventQueue-0: Context not current on thread, obj 0x2ab44e2d, ctx 0x0, surf 0x0, inDestruction: false, <53f7c06e, 2e7aa0d3>[count 0, qsz 0, owner <NULL>] 

나는 캔버스 사이를 전환 할 수 사용하고 코드는입니다 :

public void start() 
{ 
    canvas.addGLEventListener(this); 
    animator.start(); 
    window.add(canvas); 
    canvas.requestFocus(); 
} 
public void stop() 
{ 
    window.remove(canvas); 
    animator.stop(); 
    canvas.removeGLEventListener(this); 
} 

스위치 기능 :

public void switchToCanvas(String canvasName) 
{ 
    currentCanvas = canvasName; 

    if(canvasName.equals("GameCanvas")) 
    { 
     menu.stop(); 
     game.start(); 
    } 
    else 
    { 
     game.stop(); 
     menu.start(); 
    } 
} 

나는 약간의 인터넷 검색을 해봤 내가이 문제를 해결했다 : How can I create my own openGL context and bind it to a GLCanvas?

그러나 거기에 게시 된 솔루션 중 아무 것도 나를 위해 일하지 않았습니다.

답변

1

처음에는 GLJPanel 인스턴스 2 개 대신 단일 GLCanvas를 사용하려고합니다. GLJPanel은 메모리 공간이 더 큽니다. 중량이 많고 가벼운 구성 요소를 혼합 할 때 몇 가지 문제가있는 경우 GLWindow 또는 AWT/SWT GLCanvas를 사용할 수없는 경우에만 사용해야합니다.

둘째,이 오류 메시지는이 스레드에 OpenGL 컨텍스트가 없음을 의미합니다. GLAutoDrawable.invoke()를 사용하여 OpenGL 작업을 대기열에 넣거나 필요한 경우 컨텍스트를 최신 상태로 만들어야합니다. 우리가 예제에서 jogl 데모를 어떻게 보는지 당신이보기를 권합니다.

편집 : 저를 포함한 JogAmp 관리자는 공식 포럼 (http://forum.jogamp.org/)과 IRC에서 쉽게 연락 할 수 있습니다.

+0

답변을 주셔서 감사합니다. 몇 가지 예를 살펴보고 실패 할 경우 포럼에 올 것입니다. 나는 GLCanvas 대신 GLJPanel을 사용한 이유는 GLCanvas가 JFrame으로 잘 돌아 가지 않았기 때문이라고 생각합니다. 이 일에 대해 아는 것이 있습니까? 또한, init() 함수 내에서 GLAutoDrawable.invoke()를 정확히 사용 하시겠습니까? – user1870238

+0

당신을 진심으로 환영합니다. AWT (중량급)와 Swing (경량) 구성 요소를 혼합하는 것은 Java 1.6 업데이트 10부터 잘 지원되어야하지만 여전히 문제가있는 경우가 있으며 특히 JOGL과 관련이없는 경우가 있습니다. 그것은 JFrame에서 실제로하는 일에 달려 있습니다. 하나의 JPanel을 JFrame에 넣고 GLCanvas 또는 NewtCanvasAWT를이 JPanel에 넣으면 작동합니다. 가능한 경우 GLWindow를 사용하십시오. – gouessej