Percy

如何最好地定位Swing GUI?

java

在另一个线程中,我表示我喜欢通过执行以下操作来居中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);

但是安德鲁·汤普森(Andrew Thompson)有不同的看法,而是打电话给

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

想问的人想知道为什么吗?


阅读 300

收藏
2020-11-30

共1个答案

小编典典

在我看来,屏幕中间的一个GUI看起来是这样的。我一直在等待它们消失,真正的GUI出现!

从Java 1.5开始,我们可以使用Window.setLocationByPlatform(boolean)。哪一个..

设置此窗口是否应在下一次使该窗口可见时显示在本机窗口系统的默认位置还是当前位置(由getLocation返回)。此行为类似于未通过编程设置其位置而显示的本机窗口。如果未明确设置窗口的位置,大多数窗口系统会级联窗口。一旦窗口显示在屏幕上,便确定了实际位置。

看一下这个示例的效果,该示例将3个GUI置于OS选择的默认位置-在Windows 7,Linux和Gnome&Mac OS X上。

Windows 7上的堆叠式Windows 在此处输入图片说明 Mac OS X上的堆叠式视窗

(3个)3个GUI整齐地堆叠在一起。对于最终用户而言,这代表了“最不惊奇的道路”,因为这是操作系统可能放置默认纯文本编辑器的3个实例的方式(或者其他任何方式)。感谢Linux和Mac的rashgod。图片。

这是使用的简单代码:

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();
            }
        });
    }
}
2020-11-30