索引越界异常尝试使用 Swing 和 JOGL 创建窗口

Posted

技术标签:

【中文标题】索引越界异常尝试使用 Swing 和 JOGL 创建窗口【英文标题】:Index out of bound exception trying to create a window with Swing and JOGL 【发布时间】:2021-12-18 02:49:21 【问题描述】:

这段代码只是用来显示一个窗口并设置它的背景颜色:

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

【问题讨论】:

【参考方案1】:

我终于找到了解决方案。我将我的 OpenJDK 版本更改为 11。它正常工作,我不知道为什么。我不知道错误出现在哪个确切版本,11 之前的版本似乎可以工作。

编辑 据说它已在最新版本的 JOGL 中修复,因此您可能需要更新 .jar

【讨论】:

【参考方案2】:

找到这个:https://forum.jogamp.org/Crash-in-WindowsAWTWGLGraphicsConfigurationFactory-td4040703.html

来源 https://github.com/JogAmp/jogl/blob/master/src/jogl/classes/jogamp/opengl/windows/wgl/awt/WindowsAWTWGLGraphicsConfigurationFactory.java

源代码: 170:如果(0> gcIdx) 171:选择GC =配置[gcIdx]; 使用负索引 数组总是会崩溃的。

看起来你也在使用负索引。

【讨论】:

在您的链接的评论部分,他们正在谈论向 java 命令添加“-m”选项。这个问题可能来自 OpenJDK 的版本。我要测试一下。 我试过了,但它不能像这样使用命令行(添加 -m 参数不是解决方案):C:\Users\mchulotte\.jdks\openjdk-17.0 .1\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.2.3\lib\idea_rt.jar=60146:C:\Program Files\JetBrains\IntelliJ IDEA 2021.2.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\ItelliJ Java\out\production\Basic Canva;C:\JOGL\graphicslib3D.jar;C:\JOGL\jogamp-all-platforms\jar\gluegen-rt. jar;C:\JOGL\jogamp-all-platforms\jar\jogl-all.jar" 代码 -m 我看到您通过升级 java.util.不要忘记将您的答案标记为答案。 已在 JOGL 2.4.0 的最新候选版本中修复:jogamp.org/deployment/v2.4.0-rc-20210111

以上是关于索引越界异常尝试使用 Swing 和 JOGL 创建窗口的主要内容,如果未能解决你的问题,请参考以下文章

越界异常和空指针异常

ArrayList 中的索引越界异常

奇怪的数组索引越界异常

Java IntelliJ 分析空指针异常、索引越界等代码的最佳方法是啥[关闭]

使用 JOGL 的 glDrawElementsInstanced() 的索引参数中的内容

带有 JOGL 2.0 的 GLProfile 中的空指针异常