如何更好地定位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); 

并询问头脑想知道为什么?

在我看来,在屏幕中间的GUI看起来如此..“splash-screen'ish”。 我一直在等待他们消失, 真正的 GUI出现!

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

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

看看这个例子的效果,这个例子把3个GUI放到操作系统select的默认位置 – 在Windows 7上,Linux上用Gnome和Mac OS X.

在Windows 7上堆叠的窗口在这里输入图像描述Mac OS X上的堆叠窗口

(3手)3个graphics用户界面整齐堆叠。 这代表了最终用户的“最less惊喜之路”,因为操作系统可能会定位默认纯文本编辑器的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上打开。所以这里是一个更完整的解决scheme,我想:

  ... // 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);