簡體   English   中英

Java:JFrame.setLocationRelativeTo(null)不使用OpenJDK 1.6.0_18將窗口置於Ubuntu 10.04 / gnome 2.30.2的中心

[英]Java: JFrame.setLocationRelativeTo(null) not centering the window on Ubuntu 10.04 / gnome 2.30.2 with OpenJDK 1.6.0_18

示例代碼:

    JFrame jFrame = new JFrame("Test");
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.setLocationRelativeTo(null);
    jFrame.setSize(600, 600);
    jFrame.pack();
    // jFrame.setLocationRelativeTo(null); // same results
    jFrame.setVisible(true);

截圖

這是OpenJDK的錯嗎? 我記得聽說它不如Sun的那么好,但是因為它成了Ubuntu的標准,或者我決定與它一起使用的任何東西。 該程序可能會在Windows上運行,所以我想我將不得不在那里檢查...任何簡單的方法以平台無關的方式解決這個問題而不會破壞它已經運行的地方?

JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);
jFrame.pack();
jFrame.setVisible(true);
jFrame.setLocationRelativeTo(null); //To center the code

這將糾正問題並使Jframe居中

一種方法是手動定位窗口。 在調用pack()之后立即輸入以下代碼。

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Point middle = new Point(screenSize.width / 2, screenSize.height / 2);
Point newLocation = new Point(middle.x - (jFrame.getWidth() / 2), 
                              middle.y - (jFrame.getHeight() / 2));
jFrame.setLocation(newLocation);

免責聲明,這只是在Windows上測試過。

此外,您應始終使用setPreferredSize()而不是setSize()

只是一個精度:如果您在框架大小之前設置位置,您將在窗口的左上角居中,因為大小為(0,0)。 您必須在該位置之前設置大小。

JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(600, 600);
jFrame.pack();
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);

OpenJDK-6和Ubuntu 13.04適用於我。 在其他平台上試用。

jFrame.validate();

這實際上更好,因為pack可以改變幀大小,而validate留下幀大小。

我知道這是一個老問題,但setLocationRelativeTo()可以工作但必須在pack()之后調用。 Frame的getWidth()和getHeight()在打包后返回不同(正確)的值,這就是OP無法居中的原因。

在給出相對位置之前,不應聲明jFrame大小。 如果您這樣做會發生什么,這將使您的iFrame遠離給定位置。

這是錯的----

JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);
jFrame.pack();
jFrame.setVisible(true);

這是正確的 - -

JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//size comes first
jFrame.setSize(600, 600);

//and then the position
jFrame.setLocationRelativeTo(null);

jFrame.pack();
jFrame.setVisible(true);

只需設置位置之前設置大小。

錯誤:

jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);

正確:

jFrame.setSize(600, 600);
jFrame.setLocationRelativeTo(null);

注意:最后調用setVisible()以防止窗口“跳躍”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM