Java: JFrame.setLocationRelativeTo (null) не центрирует окно в Ubuntu 10.04 / gnome 2.30.2 с OpenJDK 1.6.0_18 - PullRequest
10 голосов
/ 13 августа 2010

Пример кода:

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

снимок экрана http://img193.imageshack.us/img193/5296/screenshotrev.png

Это ошибка OpenJDK?Я помню, что слышал, что это не так хорошо, как у Sun, но, поскольку он стал стандартом для Ubuntu или чего-то другого, я решил согласиться с ним.Программа, вероятно, будет работать на Windows, поэтому я полагаю, что мне придется проверить там ... Любой простой способ исправить это независимо от платформы, не нарушая ее там, где она уже работает?

Ответы [ 7 ]

20 голосов
/ 18 марта 2011
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

5 голосов
/ 13 августа 2010

Одним из способов является ручное позиционирование окна.Введите следующий код сразу после вашего звонка на 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().

3 голосов
/ 03 октября 2013

Просто точность: если вы установите местоположение до размера рамки, вы будете центрировать верхний левый угол окна, потому что размер (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. Попробуйте на других платформах.

3 голосов
/ 05 ноября 2011
jFrame.validate();

На самом деле это работает лучше, поскольку пакет может изменить размер кадра, тогда как validate оставляет размер кадра в покое.

2 голосов
/ 10 мая 2013

Я знаю, что это старый вопрос, но setLocationRelativeTo () будет работать, но он должен быть вызван после pack ().Кадровые getWidth () и getHeight () возвращают разные (правильные) значения после упаковки, и поэтому OP не может центрироваться.

0 голосов
/ 06 июля 2018

Просто установите размер перед настройкой местоположения.

Неправильно:

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

Правильно:

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

Примечание: Вызовите setVisible () наконец, чтобы предотвратить "прыжок" окна.

0 голосов
/ 09 января 2014

Вы не должны объявлять размер 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);
...