You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JSplitPane时AWTGLCanvas的initGL()重复执行问题求助

调整JSplitPane窗口大小时AWTGLCanvas的initGL()重复执行问题

我正在开发一款用于学习实践的GUI游戏引擎,当前的initGL()方法实现如下:

@Override
public void initGL() {
    createCapabilities();
    glEnable(GL_DEPTH_TEST);
    glCullFace(GL_BACK);
    Main.init();
    try {
        Main.main(null);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

(注:这只是测试代码,后续会优化)

Main类是我之前使用GLFW时编写的类,不想迁移所有代码所以保留了当前结构。现在遇到的问题是:使用JSplitPane时,每次调整窗口大小,OpenGL都会重启——至少initGL()方法会重复执行。

我能确认这点的原因是:Main.main(null)方法会创建一个包含JSlider的JFrame,用来修改某些渲染属性,每次调整窗口大小都会弹出一个新的该JFrame窗口。

为方便复现问题,我修改了官方示例代码,添加了JSplitPane,代码如下:

import static org.lwjgl.opengl.GL.createCapabilities;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_QUADS;
import static org.lwjgl.opengl.GL11.glBegin;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glClearColor;
import static org.lwjgl.opengl.GL11.glColor3f;
import static org.lwjgl.opengl.GL11.glEnd;
import static org.lwjgl.opengl.GL11.glVertex2f;
import static org.lwjgl.opengl.GL11.glViewport;
import static org.lwjgl.opengl.GL11.*;

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;

import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.awt.AWTGLCanvas;
import org.lwjgl.opengl.awt.GLData;

public class AWTTest {
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("AWT test");
        JPanel emptyPanel = new JPanel();
        JSplitPane splitPane;
        GLData data = new GLData();
        AWTGLCanvas canvas;
        
        emptyPanel.add(new JButton("E"));

        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.setPreferredSize(new Dimension(600, 600));
        frame.add(canvas = new AWTGLCanvas(data) {
            private static final long serialVersionUID = 1L;

            @Override
            public void initGL() {
                System.out.println("OpenGL version: " + effective.majorVersion + "." + effective.minorVersion
                        + " (Profile: " + effective.profile + ")");
                createCapabilities();
                glClearColor(0.3f, 0.4f, 0.5f, 1);
            }

            @Override
            public void paintGL() {
                int w = 600;
                int h = 600;
                float aspect = (float) w / h;
                double now = System.currentTimeMillis() * 0.001;
                float width = (float) Math.abs(Math.sin(now * 0.3));
                glClear(GL_COLOR_BUFFER_BIT);
                glViewport(0, 0, w, h);
                glBegin(GL_QUADS);
                glColor3f(0.4f, 0.6f, 0.8f);
                glVertex2f(-0.75f * width / aspect, 0.0f);
                glVertex2f(0, -0.75f);
                glVertex2f(+0.75f * width / aspect, 0);
                glVertex2f(0, +0.75f);
                glEnd();
                swapBuffers();
            }
        }, BorderLayout.CENTER);

        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, emptyPanel, canvas);

        frame.add(splitPane);
        frame.pack();
        frame.setVisible(true);
        frame.transferFocus();

        Runnable renderLoop = new Runnable() {
            @Override
            public void run() {
                canvas.render();
                SwingUtilities.invokeLater(this);
            }
        };
        SwingUtilities.invokeLater(renderLoop);
    }
}

(此前在GitHub提交的问题未收到回复,故重新发布)


内容的提问来源于stack exchange,提问作者user23787503

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:15:19