以下是我在主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
,为什么会这样?
答案 0 :(得分:4)
setLocationRelativeTo
使用窗口的当前大小来决定应该放置的位置,因为窗口尚未调整大小,它使用0x0
,pack
提供了初始大小,因此首先调用它会为setLocationRelativeTo
提供所需的信息
你必须认识到,在布置一个组件之前(或者在这种情况下,直到窗口打包或调整大小为止)它没有大小。
例如......
mainFrame.setLocationRelativeTo(null);
mainFrame.pack();
这样说,将窗口(0x0
的大小设置为屏幕的中心点,然后使用pack
提供实际尺寸
在哪里......
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
表示pack
框架为其提供初始尺寸及其相对于屏幕中心的位置,其中考虑了由pack
计算的窗户尺寸