gpt4 book ai didi

java - 为什么在 JFrame.setVisible(true) 之后调用 JFrame.pack() 会影响 JFrame 显示的位置?

转载 作者:行者123 更新时间:2023-12-03 04:09:06 30 4
gpt4 key购买 nike

我正在使用 XFCE 4 桌面的 Debian 8 上编译并运行以下代码。

import javax.swing.JFrame;
import javax.swing.JComponent;
import java.awt.EventQueue;
import java.awt.Dimension;
import java.awt.Graphics;

public class FrameDemo
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.setLocationByPlatform(true);
frame.add(new HelloWorldComponent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
}

class HelloWorldComponent extends JComponent
{
public void paintComponent(Graphics g)
{
g.drawString("hello, world", 50, 50);
}

public Dimension getPreferredSize()
{
return new Dimension(200, 100);
}
}

这会产生所需的输出。框架位于桌面中央。

enter image description here

但是当我将 frame.pack() 语句移到 frame.setVisible(true) 语句之后,即我在显示框架后打包时,我不这样做不再看到所需的输出。

                JFrame frame = new JFrame();
frame.setLocationByPlatform(true);
frame.add(new HelloWorldComponent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();

该框架现在显示在桌面的左上角。

enter image description here

事实上,框架确实在桌面中央短暂地出现了不到一秒。大约一秒钟后,框架移动到桌面的左上角。

为什么移动 frame.pack() 语句的位置会改变框架在桌面上的显示位置?

最佳答案

pack() 调用 setClientSize(),而 setClientSize() 本身又调用 setBounds(x,y,w,h)

无论哪种方式,在我的计算机上,它似乎总是显示在左上角。

<小时/>

这是 JavaDoc about Window#setLocationByPlatform 中您的解释

Calls to setVisible, setLocation and setBounds after calling setLocationByPlatform clear this property of the Window. For example, after the following code is executed:

setLocationByPlatform(true); setVisible(true); boolean flag = isLocationByPlatform(); The window will be shown at platform's default location and flag will be false. In the following sample:

setLocationByPlatform(true); setLocation(10, 10); boolean flag = isLocationByPlatform(); setVisible(true); The window will be shown at (10, 10) and flag will be false.

<小时/>

替代方案

如果您希望窗口居中,请使用 JFrame#setLocationRelativeTo(null) (重要的是给它 null 作为参数)。

If the component is null, or the GraphicsConfiguration associated with this component is null, the window is placed in the center of the screen.

关于java - 为什么在 JFrame.setVisible(true) 之后调用 JFrame.pack() 会影响 JFrame 显示的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159898/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com