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

时间:2015-08-05 01:49:46

标签: 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 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();
  }
}

所以我的问题是pack()在我们之前setLocationRelativeTo(null)以及之后的setLocationRelativeTo(null)工作方式有何不同?

如果我们在pack()之后setVisible(true),那么效果很好。

尽管这个最小例子的差异并不大,但在我实际工作的GUI中,这就产生了一个巨大的问题。请解释一下。

编辑我的第二个问题是我听说建议在打包之前调用setReiszable(false)%APPDATA%\Roaming\Pyscripter\skins,为什么会这样?

1 个答案:

答案 0 :(得分:4)

setLocationRelativeTo使用窗口的当前大小来决定应该放置的位置,因为窗口尚未调整大小,它使用0x0pack提供了初始大小,因此首先调用它会为setLocationRelativeTo提供所需的信息

你必须认识到,在布置一个组件之前(或者在这种情况下,直到窗口打包或调整大小为止)它没有大小。

例如......

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

这样说,将窗口(0x0的大小设置为屏幕的中心点,然后使用pack提供实际尺寸

在哪里......

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

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