请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

【勘误】关于我们的GUI模板代码在Windows中的不兼容“边距”解决方案

对于这一章所介绍的GUI模板代码,在Windows系统下运行会有一个小瑕疵。如果大家尝试在其中绘制一个左上角坐标为(0,0),宽和高分别为canvasWidth和canvasHeight的矩形,就会发现这个矩形无法填充整个窗口。感谢课程问答区 @就是个蛋 和QQ讨论群 @瞎忙就剁手 提出的问题。具体显示效果见下:

https://img1.sycdn.imooc.com/szimg//59cecd400001b58405160539.jpg


出现这个问题,是由于Java Swing的JFrame在Windows系统下会添加一些额外的“装饰信息”,其中包括Windows窗口“认为”合适的边距信息。注意:Java语言本身是跨平台的,但这不意味着Java Swing的GUI代码在不同的操作系统上表现是一样的。事实上他们很不一样,在不同的操作系统上将调用不同的窗口风格,同时一些代码行为由于操作系统的原因也会改变。比如这个“装饰的边距信息”,在macOS下被认为是0;在Windows下我测试大概是16个像素左右:(所以就会出现上图这样的问题。


具体应该如何修改?非常简单,我们调用pack();前,需要先调用setResizable(false);。这个边距信息实际上是在pack()时添加的,我们先强制让系统也不能resize我们的窗口,再pack,就可以解决这个问题了:)


对于修改后,我们的GUI模板中,AlgoFrame的构造函数应该是这样的:

public AlgoFrame(String title, int canvasWidth, int canvasHeight){
    super(title);
    
    this.canvasWidth = canvasWidth;
    this.canvasHeight = canvasHeight;
    
    AlgoCanvas canvas = new AlgoCanvas();
    setContentPane(canvas);
    
    setResizable(false);
    pack();  // 在确保系统也不会修改我们的窗口大小后进行pack!
    
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}


非常非常抱歉,我之前没有测试Windows环境下的不兼容,希望大家谅解。


大家加油!:)

正在回答 回答被采纳积分+3

1回答

提问者 liuyubobobo 2019-06-11 01:09:54

我将这个问题置顶了,供大家参考:)

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信