Windows缩放导致JOGL画布出现空白区域的解决方法咨询
解决JOGL 2.3.2在Windows高DPI缩放时GLCanvas无法填满窗体的问题
问题根源
Windows的高DPI缩放(如125%)会导致Java Swing逻辑像素与物理像素不匹配,JOGL的GLCanvas默认未适配这种缩放规则,从而出现顶部和右侧的黑色空白区域。
解决方案
1. 让GLCanvas自动填充窗体客户区
去掉手动设置GLCanvas固定尺寸的代码,利用Swing默认的BorderLayout让画布自动填满整个窗体客户区:
修改窗体创建代码:
//FrameMain class just adds listener to frame so it can be closed by pressing cross button final FrameMain frame = new FrameMain("Form 1"); frame.setSize(720, 720); // 启用JOGL高DPI支持,必须在创建GLProfile之前调用 GLProfile.enableHighDPISupport(); final GLProfile profile = GLProfile.get(GLProfile.GL2); GLCapabilities capabilities = new GLCapabilities(profile); // The canvas final GLCanvas glcanvas = new GLCanvas(capabilities); AppMain b = new AppMain(); glcanvas.addGLEventListener(b); // 去掉固定尺寸设置,显式指定CENTER位置让画布自动填充窗体 frame.add(glcanvas, BorderLayout.CENTER); frame.setVisible(true);
2. 修正Reshape方法的投影矩阵
原reshape方法仅设置了视口,未同步更新投影矩阵,导致绘制内容的坐标范围无法匹配实际视口尺寸。修改reshape方法:
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { GL2 gl = drawable.getGL().getGL2(); // 设置视口为画布的实际物理像素尺寸 gl.glViewport(0, 0, width, height); // 切换到投影矩阵模式,设置正交投影确保-1~1的坐标覆盖整个视口 gl.glMatrixMode(GL2.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrtho(-1, 1, -1, 1, -1, 1); // 切回模型视图矩阵模式 gl.glMatrixMode(GL2.GL_MODELVIEW); gl.glLoadIdentity(); }
3. 添加JVM启动参数启用高DPI感知
运行Java程序时添加以下JVM参数,让Java应用正确识别Windows的DPI缩放规则:
-Dsun.java2d.dpiaware=true -Djogl.enableHighDPISupport=true
原理说明
GLProfile.enableHighDPISupport():告知JOGL启用高DPI适配,让GLCanvas的尺寸计算基于物理像素而非逻辑像素。- 利用BorderLayout自动填充:避免手动固定尺寸导致的缩放不匹配问题,确保画布随窗体尺寸变化自动调整。
- 修正投影矩阵:让绘制的坐标范围(-1到1)完全对应GLCanvas的实际视口,消除空白区域。
内容的提问来源于stack exchange,提问作者StreakerOne
相关产品推荐
相关产品推荐

