尝试使用 Swing 和 JOGL 创建 window 的索引越界异常
Index out of bound exception trying to create a window with Swing and JOGL
此代码只是用来显示 window 并设置其背景颜色:
public class Code extends JFrame implements GLEventListener {
private GLCanvas myCanvas;
public Code() {
setTitle("Chapter2 - program1");
setSize(800, 600);
setLocation(400, 400);
myCanvas = new GLCanvas();
myCanvas.addGLEventListener(this);
this.add(myCanvas);
setVisible(true);
}
public void display(GLAutoDrawable drawable)
{ GL4 gl = (GL4) GLContext.getCurrentGL();
float[] bkg = { 1.0f, 0.0f, 0.0f, 1.0f };
FloatBuffer bkgBuffer = Buffers.newDirectFloatBuffer(bkg);
gl.glClearBufferfv(GL_COLOR, 0, bkgBuffer);
}
public static void main(String[ ] args) {
new Code();
}
public void init(GLAutoDrawable drawable) { }
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { }
public void dispose(GLAutoDrawable drawable) { }
我得到的错误是这个:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1
at jogamp.opengl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(WindowsAWTWGLGraphicsConfigurationFactory.java:171)
at com.jogamp.nativewindow.GraphicsConfigurationFactory.chooseGraphicsConfiguration(GraphicsConfigurationFactory.java:424)
at com.jogamp.opengl.awt.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:1560)
at com.jogamp.opengl.awt.GLCanvas.addNotify(GLCanvas.java:611)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4839)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4839)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4839)
at java.desktop/javax.swing.JRootPane.addNotify(JRootPane.java:729)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/java.awt.Window.addNotify(Window.java:791)
at java.desktop/java.awt.Frame.addNotify(Frame.java:495)
at java.desktop/java.awt.Window.show(Window.java:1053)
at java.desktop/java.awt.Component.show(Component.java:1728)
at java.desktop/java.awt.Component.setVisible(Component.java:1675)
at java.desktop/java.awt.Window.setVisible(Window.java:1036)
at Code.<init>(Code.java:19)
at Code.main(Code.java:30)
我正在使用 java 8 和 sdk 17.0
找到这个:https://forum.jogamp.org/Crash-in-WindowsAWTWGLGraphicsConfigurationFactory-td4040703.html
源代码:
170:如果(0 > gcIdx){
171:选择GC =配置[gcIdx];
在一个上使用负索引
数组总是会崩溃。
看来您也在使用负索引。
我终于找到了解决办法。我将我的 OpenJDK 版本更改为 11。它运行正常,但我不知道为什么。我不知道错误出现在哪个版本,11 之前的版本似乎可以工作。
编辑
它应该在最新版本的 JOGL 中得到修复,因此您可能需要更新 .jar
此代码只是用来显示 window 并设置其背景颜色:
public class Code extends JFrame implements GLEventListener {
private GLCanvas myCanvas;
public Code() {
setTitle("Chapter2 - program1");
setSize(800, 600);
setLocation(400, 400);
myCanvas = new GLCanvas();
myCanvas.addGLEventListener(this);
this.add(myCanvas);
setVisible(true);
}
public void display(GLAutoDrawable drawable)
{ GL4 gl = (GL4) GLContext.getCurrentGL();
float[] bkg = { 1.0f, 0.0f, 0.0f, 1.0f };
FloatBuffer bkgBuffer = Buffers.newDirectFloatBuffer(bkg);
gl.glClearBufferfv(GL_COLOR, 0, bkgBuffer);
}
public static void main(String[ ] args) {
new Code();
}
public void init(GLAutoDrawable drawable) { }
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { }
public void dispose(GLAutoDrawable drawable) { }
我得到的错误是这个:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1
at jogamp.opengl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(WindowsAWTWGLGraphicsConfigurationFactory.java:171)
at com.jogamp.nativewindow.GraphicsConfigurationFactory.chooseGraphicsConfiguration(GraphicsConfigurationFactory.java:424)
at com.jogamp.opengl.awt.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:1560)
at com.jogamp.opengl.awt.GLCanvas.addNotify(GLCanvas.java:611)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4839)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4839)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4839)
at java.desktop/javax.swing.JRootPane.addNotify(JRootPane.java:729)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/java.awt.Window.addNotify(Window.java:791)
at java.desktop/java.awt.Frame.addNotify(Frame.java:495)
at java.desktop/java.awt.Window.show(Window.java:1053)
at java.desktop/java.awt.Component.show(Component.java:1728)
at java.desktop/java.awt.Component.setVisible(Component.java:1675)
at java.desktop/java.awt.Window.setVisible(Window.java:1036)
at Code.<init>(Code.java:19)
at Code.main(Code.java:30)
我正在使用 java 8 和 sdk 17.0
找到这个:https://forum.jogamp.org/Crash-in-WindowsAWTWGLGraphicsConfigurationFactory-td4040703.html
源代码: 170:如果(0 > gcIdx){ 171:选择GC =配置[gcIdx]; 在一个上使用负索引 数组总是会崩溃。
看来您也在使用负索引。
我终于找到了解决办法。我将我的 OpenJDK 版本更改为 11。它运行正常,但我不知道为什么。我不知道错误出现在哪个版本,11 之前的版本似乎可以工作。
编辑 它应该在最新版本的 JOGL 中得到修复,因此您可能需要更新 .jar