[英]Java VM: reproducible SIGSEGV on both 1.6.0_17 and 1.6.0_18, how to report?
[英]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.