如何最佳定位 Swing GUI?

另一条线中,我说我喜欢通过这样的方式来集中我的 GUI:

JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new HexagonGrid());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

但是安德鲁 · 汤普森却有不同的看法

frame.pack();
frame.setLocationByPlatform(true);

想知道为什么吗?

26447 次浏览

在我看来,屏幕中间的图形用户界面看起来是这样的。.“闪屏”之类的。我一直在等待他们消失和 真的图形用户界面出现!

从 Java 1.5开始,我们可以访问 Window.setLocationByPlatform(boolean)

设置下次窗口可见时,这个窗口是应该出现在本机视窗系统的默认位置,还是出现在当前位置(由 getLocation 返回)。此行为类似于未经编程设置其位置而显示的本机窗口。一旦窗口显示在屏幕上,实际位置就确定了。

看看这个例子的效果,它将3个 GUI 放到了 OS 所选择的默认位置-在 Windows 7,Linux 和 Gnome & Mac OS X 上。

Stacked windows on Windows 7 enter image description here Stacked windows on Mac OS X

3个图形用户界面整齐地堆放在一起。这代表了最终用户的“最小惊喜路径”,因为这是操作系统如何定位默认纯文本编辑器的3个实例(或者其他任何东西)。感谢垃圾之神为我们提供了 Linux & Mac。影像。

下面是使用的简单代码:

import javax.swing.*;


class WhereToPutTheGui {


public static void initGui() {
for (int ii=1; ii<4; ii++) {
JFrame f = new JFrame("Frame " + ii);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
String s =
"os.name: " + System.getProperty("os.name") +
"\nos.version: " + System.getProperty("os.version");
f.add(new JTextArea(s,3,28));  // suggest a size
f.pack();
// Let the OS handle the positioning!
f.setLocationByPlatform(true);
f.setVisible(true);
}
}


public static void main(String[] args) {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {}
initGui();
}
});
}
}

我完全同意 setLocationByPlatform(true)是指定新 JFrame 位置的最好方法,但是在 双显示器设置双显示器设置上可能会出现问题。在我的例子中,子 JFrame 是在“另一个”监视器上产生的。例如: 我在屏幕2上有我的主 GUI,我用 setLocationByPlatform(true)启动一个新的 JFrame,它在屏幕1上打开。所以这里有一个更完整的解决方案,我认为:

...
// Let the OS try to handle the positioning!
f.setLocationByPlatform(true);
if (!f.getBounds().intersects(MyApp.getMainFrame().getBounds())) {
// non-cascading, but centered on the Main GUI
f.setLocationRelativeTo(MyApp.getMainFrame());
}
f.setVisible(true);