如何最好地定位 Swing GUI?

Posted

技术标签:

【中文标题】如何最好地定位 Swing GUI?【英文标题】:How to best position Swing GUIs? 【发布时间】:2011-10-31 21:06:12 【问题描述】:

在another thread 中,我表示我喜欢通过执行以下操作来使我的 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);

好奇的人想知道为什么?

【问题讨论】:

gui 应该从上次结束的地方开始。 【参考方案1】:

我完全同意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);

【讨论】:

【参考方案2】:

在我看来,屏幕中间的 GUI 看起来如此..“闪屏”。我一直在等待它们消失,真正的 GUI 出现!

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

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

看看这个示例的效果,它将 3 个 GUI 置于操作系统选择的默认位置 - 在 Windows 7 上、带有 Gnome 的 Linux 和 Mac OS X 上。

(3 批)3 个 GUI 整齐堆叠。这代表了最终用户的“最不意外的路径”,因为它是操作系统如何定位默认纯文本编辑器(或其他任何东西)的 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();
            
        );
    

【讨论】:

@AndrewThompson 为什么你的计数器变量是ii 而不仅仅是i?这是否符合某种惯例,还是个人喜好(或者可能完全不同)? @MirroredFate 嗯.. 我想我会在那里锁定选项 3,“完全不同的东西”。这正是我第一次使用 Basic 编程时所习惯的(是的,很久以前)。懒惰是继续使用的原因,“如果它没有坏,就不要修理它”。 @MirroredFate 你是波斯王子范吗?我很抱歉把它放在这里。我就是忍不住 @MirroredFate 这就是我使用ii 而不是i 的原因。当我参加编程比赛时,我经常不得不搜索循环索引,例如,+1-1 以修复一个错误。在这些情况下,搜索ii 比搜索i 容易得多,无论我使用哪个编辑器。同样,我使用jjkk 作为嵌套循环索引。 :)

以上是关于如何最好地定位 Swing GUI?的主要内容,如果未能解决你的问题,请参考以下文章

你最好的 Swing 设计模式和技巧是啥? [关闭]

在 GUI 应用程序中定位小部件 (PySide)

来自邮政编码的 Java Swing GoogleMaps 地理定位

重用初始化耗时的 Swing 组件

目标定位基于matlab GUI卡尔曼滤波定位含Matlab源码 2309期

目标定位基于matlab GUI卡尔曼滤波定位含Matlab源码 2309期