Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:JFrame.setLocationRelativeTo(null)在使用OpenJDK1.6.018的Ubuntu 10.04/gnome 2.30.2上未将窗口居中_Java_Ubuntu_Jframe_Gnome - Fatal编程技术网

Java:JFrame.setLocationRelativeTo(null)在使用OpenJDK1.6.018的Ubuntu 10.04/gnome 2.30.2上未将窗口居中

Java:JFrame.setLocationRelativeTo(null)在使用OpenJDK1.6.018的Ubuntu 10.04/gnome 2.30.2上未将窗口居中,java,ubuntu,jframe,gnome,Java,Ubuntu,Jframe,Gnome,示例代码: JFrame jFrame = new JFrame("Test"); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrame.setLocationRelativeTo(null); jFrame.setSize(600, 600); jFrame.pack(); // jFrame.setLocationRelativeTo(null); //

示例代码:

    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上运行,所以我想我得检查一下。。。有没有一种简单的方法可以通过独立于平台的方式修复此问题,而不必在它已经工作的地方破坏它?

一种方法是手动定位窗口。将以下代码放在调用
pack()
之后

免责声明,这只在windows上测试过

此外,您应该始终使用
setPreferredSize()
而不是
setSize()

这将纠正问题,并使机架居中

jFrame.validate();

这实际上效果更好,因为pack可以更改帧大小,而
validate
只保留帧大小。

我知道这是一个老问题,但是setLocationRelativeTo()可以工作,但必须在pack()之后调用它。帧的getWidth()和getHeight()在打包后返回不同的(正确的)值,这就是OP无法居中的原因。

只是一个精度:如果在帧大小之前设置位置,则将窗口左上角居中,因为大小为(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的大小。如果您这样做,会发生的是将iFrame从给定位置拉开

这是错误的----

这是对的----


只需在设置位置之前设置大小

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

jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);
jFrame.setSize(600, 600);
jFrame.setLocationRelativeTo(null);
正确:

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

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

在屏幕截图中,左上角完全居中。您只需要将其偏移帧的高度和宽度,正如Evan指出的,这段代码在代码中调用setLocationRelativeTo()太早了。必须在pack()/setSize()之后完成。还要注意的是,在您的示例和Evan的示例中,如果紧接着是pack(),那么对setSize()的调用是多余的。@captain,您得到的结果与您的问题中的结果相同?@captain,请尝试在不将getWidth和getHeight除以2的情况下运行它。所以:
newpoint(middle.x-(jFrame.getWidth()),middle.y-(jFrame.getHeight())@Justin同样的事情发生了。这很奇怪,因为我可以正常设置位置,但这两种方法都不起作用。我意识到问题在于jFrame getWidth()和getHeight()。宽度是10,高度是30,即使我已经将jframe的大小设置为600 x 600。@船长,你所说的“正常设置位置”是什么意思?@cap,同样,使用
setPreferredSize()
而不是
setSize()
基本上,在setLocationRelativeTo()之前调用pack()。这是因为pack()计算窗口的大小,这是正确执行居中计算所必需的。欢迎使用SO!您能用代码示例扩展您的答案吗?谢谢。是的,当然,我会编辑我的答案。(对不起,我是计算机科学的法国学生)。在您的评论中,您说大小是第一位的,然后将
JFrame
打包到
setLocationRelativeTo
之后。。。
jFrame.setSize(600, 600);
jFrame.setLocationRelativeTo(null);