使用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
相关产品推荐
相关产品推荐

