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