Java 当我们显式设置容器的位置时,pack()函数的行为如何?

Java 当我们显式设置容器的位置时,pack()函数的行为如何?,java,swing,layout,jframe,layout-manager,Java,Swing,Layout,Jframe,Layout Manager,下面是我在主要GUI设计中面临的问题的最小示例 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.BoxLayout; class GuiTester { JFrame mainFrame = new JFrame(); JPanel panel = new JPanel(); GuiTester() { JButton newBu

下面是我在主要GUI设计中面临的问题的最小示例

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.BoxLayout;
class GuiTester
{

JFrame mainFrame = new JFrame();
JPanel panel = new JPanel();

GuiTester()
{

    JButton newButton = new JButton();
    JButton continueButton = new JButton();
    panel.setLayout(new BoxLayout( panel, BoxLayout.Y_AXIS));
    panel.add(newButton);
    panel.add(continueButton);
    panel.add(new JButton());
    panel.add(new JButton());
    panel.add(new JButton());
    mainFrame.getContentPane().add(panel);
    mainFrame.setLocationRelativeTo(null); // if I do it here then the display of window is little towards the right side down corner.
    mainFrame.pack();
    //mainFrame.setLocationRelativeTo(null) if I do it here instead of earlier than mainFrame.pack() it works great.
    mainFrame.setVisible(true);
}

public static void main(String[] args) {
    GuiTester gui = new GuiTester();
  }
}
所以我的问题是,当我们在它之前和之后设置LocationRelativeTo(null)时,
pack()
的工作方式如何不同

如果在
pack()
之后执行
setLocationRelativeTo(null)
,效果会很好

虽然这个最小的示例中的差异不是很大,但在我实际工作的GUI中,这会产生一个很大的问题。请解释一下


EDIT我的第二个问题是,我听说建议在pack()之前调用
setVisible(true)
setreisable(false)
,为什么会这样?

setLocationRelative to
使用窗口的当前大小来决定它应该放在哪里,由于窗口尚未调整大小,它使用的是
0x0
pack
提供初始大小,因此首先调用此函数将提供
setLocationRelativeTo
所需的信息

您必须认识到,在布局组件之前(或者在这种情况下,直到窗口打包或调整大小),组件没有大小

例如

mainFrame.setLocationRelativeTo(null);
mainFrame.pack();
也就是说,将大小为
0x0
的窗口定位到屏幕的中心点,然后使用
pack
提供实际大小

作为

mainFrame.pack();
mainFrame.setLocationRelativeTo(null);

表示,
pack
为其提供初始尺寸和相对于屏幕中心的位置的框架,该框架考虑了由
pack

setLocationRelativeTo
计算的窗口大小,使用窗口的当前大小决定其应放置的位置,由于窗口尚未调整大小,它使用的是
0x0
pack
提供初始大小,因此首先调用此函数将提供
setLocationRelativeTo
所需的信息

您必须认识到,在布局组件之前(或者在这种情况下,直到窗口打包或调整大小),组件没有大小

例如

mainFrame.setLocationRelativeTo(null);
mainFrame.pack();
也就是说,将大小为
0x0
的窗口定位到屏幕的中心点,然后使用
pack
提供实际大小

作为

mainFrame.pack();
mainFrame.setLocationRelativeTo(null);

表示,
pack
为其提供初始大小和相对于屏幕中心的位置的框架,其中考虑了由
pack

计算的窗口大小。我还听说,在打包之前,我们应该将setVisible(true)或setresizeable称为setVisible,这是为什么呢,您应该在
setVisible
之前调用
pack
,或者更确切地说,最后调用
setVisible
。这里的要点是,如果您先让窗口可见,然后调用
pack
,它可能会在屏幕上显示为未打包,然后突然“弹出”到打包大小,这不是一个很好的用户体验。您应该在
pack
之前调用
setresizeable
,因为这可能会更改窗口的边框,并在内容周围产生不需要的边距。因此,将
setresizeable
pack
setVisible
按此顺序作为一般经验法则;)请看一下这个答案关于这个问题的公认答案(这是正确的信息)是“在调用
pack()
setVisible(true)
之前,确保调用
setresizeable(false)
”。。虽然它没有明确说明
setVisible(true)
应该在最后调用,但这是由该语句中方法调用的顺序暗示的。但是OK。。只是为了消除所有的疑虑。在
pack()
之前调用
setresizeable(false)
的原因是窗口“chrome”(窗口边缘的装饰)可能在可调整大小和不可调整大小的模式之间变化。通过在设置可调整大小属性后打包窗口,API将解释用于不可调整大小窗口的(通常较薄)chrome。我还听说我们应该在打包之前调用setVisible(true)或setResizeable,为什么会这样?实际上,您应该在
setVisible
之前调用
pack
,或者更确切地说,调用
setVisible
last。这里的要点是,如果您先让窗口可见,然后调用
pack
,它可能会在屏幕上显示为未打包,然后突然“弹出”到打包大小,这不是一个很好的用户体验。您应该在
pack
之前调用
setresizeable
,因为这可能会更改窗口的边框,并在内容周围产生不需要的边距。因此,将
setresizeable
pack
setVisible
按此顺序作为一般经验法则;)请看一下这个答案关于这个问题的公认答案(这是正确的信息)是“在调用
pack()
setVisible(true)
之前,确保调用
setresizeable(false)
”。。虽然它没有明确说明
setVisible(true)
应该在最后调用,但这是由该语句中方法调用的顺序暗示的。但是OK。。只是为了消除所有的疑虑。在
pack()
之前调用
setresizeable(false)
的原因是窗口“chrome”(窗口边缘的装饰)可能在可调整大小和不可调整大小的模式之间变化。通过在设置可调整大小属性后打包窗口,API将考虑用于不可调整大小窗口的(通常较薄)chrome。另请参见另一种不同的GUI定位理念在其中的应用。”…听说建议调用
setVisible(true)
setReisezable(false)
pack()之前的
True表示第二个,false表示第一个。但请将每个线程限制为一个(特定)问题。在这种情况下,我觉得第一个具体问题是