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

来源:2-11 课程所使用的GUI编程模板

liuyubobobo

2017-09-30

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

http://szimg.mukewang.com/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环境下的不兼容,希望大家谅解。


大家加油!:)

写回答

1回答

liuyubobobo

提问者

2019-06-11

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

1
0

7个经典应用诠释Java算法精髓

课程重应用、重实践、重思维,真正应用于实际工作开发中

1888 学习 · 112 问题

查看课程