在当前线程中找不到OpenGL上下文,如何修复此错误?

我正在开发纸牌游戏,目前有一个很好的基础,但是当我在eclipse中运行它时遇到了错误。 我也使用光滑的2d。

这是控制台的错误。

线程“main”中的exceptionjava.lang.RuntimeException:当前线程中找不到OpenGL上下文。 at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124)atg.lwjgl.opengl.GL11.glGetError(GL11.java:1277)at org.newdawn.slick.opengl.renderer.ImmediateModeOGLRenderer.glGetError(ImmediateModeOGLRenderer) .java:387)org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:337)atg.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:275)org.newdawn.slick。图片。(Image.java:270)org.newdawn.slick.Image。(Image.java:244)org.newdawn.slick.Image。(Image.java:232)org.newdawn.slick.Image。 (Image.java:198)在Cards.Card。(Card.java:18)

代码,我相信错误的来源(卡类)

package Cards; import org.newdawn.slick.Image; import org.newdawn.slick.SlickException; public class Card { final int numCards = 52; Image[] card = new Image [numCards]; Card (int c) { String fileLocation = new String (); for (int i = 1 ; i <= 52 ; i++) { fileLocation = "res/cards/" + i + ".png"; try { card [i] = new Image (fileLocation); //line } catch (SlickException e) { e.printStackTrace (); } } } public Image getImage (int cardlocation) { return card [cardlocation]; } } 

以前有人见过这种问题吗? 我该如何解决?

这种错误对于LWJGL启动器来说很常见。 OpenGL上下文在创建时绑定到线程。 因此,您只能从同一个线程访问此上下文。

因为它看起来并不是你在使用不同的线程,所以可能还有其他原因。 Slick2D似乎需要为其Image类提供有效的OpenGL上下文。

所以我的第一次尝试是在初始化卡片图像之前初始化OpenGL上下文。

这件事发生在我身上,直到我意识到在OpenGL初始化之前我正在调用图像加载器之前,我无法弄清楚要做什么。 在OpenGL inits(我做了什么)之前,确保你没有在构造函数(或任何其他调用的方法)中使用图像加载器定义任何变量。

您是否在初始化OpenGL之前定义了Card类?

希望这可以帮助。

在lwjgl 3.x及更高版本中,您可以尝试: GLContext.createFromCurrent();

如果您正在使用libgdx,还有Gdx.app.postRunnable(...)在渲染线程上发布Runnable

好吧,我发现你需要在设置OpenGL环境之前初始化你的显示器:)…

一个旧线程,但它可能会帮助某人。 根据您使用的LWJGL,启动您的显示器:

LWJGL 3 (使用GLFW)

 if (!glfwInit()) { throw new IllegalStateException("Can't init GLFW"); } 

LWJGL 2

 try { Display.setDisplayMode(new DisplayMode(800, 600)); Display.create(); } catch (LWJGLException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } 

我,大多数,忘了Display.create() 🙂