Java使用JFrame创建窗口时Canvas底部与右侧区域无法渲染问题
问题根因
你给JFrame设置的800600是窗口的总大小,包含了系统自带的标题栏、窗口边框的尺寸,窗口内部可放置组件的内容区实际尺寸小于800600,所以作为子组件的Canvas被挤压,绘制区域小于预期,底部和右侧内容就被裁剪了。
修复步骤
- 不要给
JFrame设置固定大小,改为给你要绘制的Main(继承自Canvas)实例设置预期的首选尺寸 - 删掉JFrame的
setPreferredSize/setMinimumSize/setMaximumSize配置,pack()方法会自动根据内部组件的尺寸计算窗口的总大小,刚好让Canvas的绘制区域等于你要的800*600 Window类不需要继承Canvas,属于无用继承可直接去掉
修改后的关键代码
// 去掉无用的Canvas继承 class Window { public Window(int w, int h, String t, Main game) { JFrame frame = new JFrame(t); // 给Canvas设置预期绘制尺寸,而不是给JFrame设固定大小 game.setPreferredSize(new Dimension(w, h)); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(game); frame.setLocationRelativeTo(null); // pack自动计算窗口总大小,适配内部Canvas尺寸 frame.pack(); frame.setVisible(true); game.start(); } }
修改后你原有测试代码里的绿色横线就会正常出现在距离底部38像素的位置,不会紧贴窗口底部,也不需要再手动调整所有元素的尺寸和位置。
内容的提问来源于stack exchange,提问作者Soren Ingraham
相关产品推荐
相关产品推荐

