2010-08-13 5 views
9

Примера код:Java: JFrame.setLocationRelativeTo (нуль) не центрирование окна на Ubuntu 10.04/гномом 2.30.2 с 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); 

screenshot http://img193.imageshack.us/img193/5296/screenshotrev.png

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

+0

В вас скриншот, верхний левый угол идеально центрирован. Вам просто нужно компенсировать его высотой и шириной рамки. – jjnguy

+6

Как указал Эван, этот код вызывает слишком рано setLocationRelativeTo(). Это должно быть сделано ** после ** pack()/setSize(). Также обратите внимание, что в вашем примере и в Evan вызов setSize() является избыточным, если сразу после него следует pack(). –

ответ

4

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

Отказ от ответственности, это было проверено только на окнах.

Кроме того, вы должны всегда использовать setPreferredSize() вместо setSize().

+0

То же самое происходит. Интересно, это мой монитор? –

+0

@captain, вы получаете те же результаты, что и в своем вопросе? – jjnguy

+0

@Justin yep: (( –

19
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

В принципе, call pack() перед setLocationRelativeTo() Это связано с тем, что pack() вычисляет размер окна, необходимый для правильного вычисления центрирования. –

3
jFrame.validate(); 

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

1

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

3

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

+0

Добро пожаловать в SO! Не могли бы вы расширить свой ответ с помощью образца кода? – Brian

+1

Спасибо. Да, конечно, я «Извините за мой английский, я французский студент по информатике». – YoannFleuryDev

0

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

В ваших комментариях вы сказали, что размер на первом месте, тогда вы упаковываете 'JFrame' aft er' setLocationRelativeTo' ... – Dan