中心JFrame与pack()相结合

Fro*_*oxx 3 java swing window jframe pack

我试图把JFrame我习惯的中心pack(),我得到它,但我认为这不是干净的方式.这就是我在做atm的方式:

JFrame window = new JFrame();

//filling
//window
//with
//stuff

window.pack();
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
int x = (dim.width - window.getPreferredSize().width) / 2, y = (dim.height - window.getPreferredSize().height) / 2;
window.setBounds(x, y, window.getPreferredSize().width, window.getPreferredSize().height);
Run Code Online (Sandbox Code Playgroud)

我在填充之后将其打包以获得最终结果PreferredSizes,因此我可以在setBounds方法中使用这些值.但我不喜欢打包后反弹.

有更好的想法吗?

dic*_*c19 7

要在屏幕中居中一个窗口,您需要window.setLocationRelativeTo(null)pack()调用之后和窗口可见之前调用:

JFrame window = new JFrame();
...

window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

根据Window#setLocationRelativeTo(Component c) docs:

public void setLocationRelativeTo(Component c)
Run Code Online (Sandbox Code Playgroud)

根据以下方案设置窗口相对于指定组件的位置.

下面提到的目标屏幕setLocationRelativeTo是在调用方法后应该将窗口放置到的屏幕.

  • 如果组件是null,或GraphicsConfiguration与该组件关联null,则窗口位于屏幕的中心.可以用该GraphicsEnvironment.getCenterPoint方法获得中心点 .

另一方面

一些开发人员可能会建议您使用Window #setLocationByPlatform(boolean flag)而不是setLocationRelativeTo(...)为了遵守运行桌面应用程序的平台的本机窗口系统的默认位置.这是有道理的,因为您的应用程序必须设计为在具有不同窗口系统和PLAF的不同平台上运行.