我正在编写一个与swing组件一起工作的应用程序,我注意到一件事我会解释 我有这些课程:
这个我实例化gui维度的枚举
public enum GuiDimension {
WIDTH(700), HEIGHT(400);
private final int value;
private GuiDimension(int value) {
this.value = value;
}
public int getValue(){
return value;
}
}
此类启动应用程序
private GamePanel gamePanel = new GamePanel();
public static void main(String[] args) {
new MainFrame();
}
public MainFrame() {
initGameFrame();
}
private void initGameFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(gamePanel);
setResizable(false);
setUndecorated(true);
pack();
setVisible(true);
setLocationRelativeTo(null);
}
}
以及设置面板大小的此类
public class GamePanel extends JPanel {
public GamePanel() {
setPreferredSize(new Dimension(GuiDimension.WIDTH.getValue(),GuiDimension.HEIGHT.getValue()));
//it makes other stuff that are not of interest for this contest
}
}
我注意到的是,枚举不是真正的整数而是对象,但是当我返回时
GuiDimension.WIDTH.getValue()
GuiDimension.HEIGHT.getValue()
它们返回的整数一旦被采用就可以用于其他目的。
现在,如果我将其插入:
SetSize (new Dimension (GuiDimension.WIDTH.getValue (), GuiDimension.HEIGHT.getValue ()));
或
SetSize (GuiDimension.WIDTH.getValue (), GuiDimension.HEIGHT.getValue ());
而不是我在示例
中插入的内容setPreferredSize(new Dimension(GuiDimension.WIDTH.getValue(),GuiDimension.HEIGHT.getValue()));
框架显示的尺寸错误,我不明白为什么。
如果GuiDimension.WIDTH.getValue ()
和GuiDimension.WIDTH.getValue ())
对setPreferredSize (...)
正确无误,
setSize (int,int)
和setSize(Dimension)
的原因不一样?
测试这个简单的代码时,您可以看到。
答案 0 :(得分:6)
大多数布局管理员会忽略调用组件的大小,但会尊重其preferredSize,有时会考虑最小值和最大值,因此当您调用pack()
时,您的大小将更改为布局管理者和组成部分的首选大小认为应该是最佳规模。
顺便提一下,根据kleopatra(Jeanette)的说法,如果你绝对需要设置一个组件的首选大小,那么最好覆盖getPreferredSize()
而不是调用setPreferredSize(...)
。后者可以通过在其他地方的同一组件上调用setPreferredSize(...)
来覆盖,而前者则可以。
顺便说一句,在您的示例代码中,您使用WIDTH两次并且似乎没有使用HEIGHT。
修改强>
您有关于包和组件大小的删除评论。我的答复是:
pack()
方法请求布局管理器对组件进行布局,以及布局管理器在这里重要 - 它们看起来是什么,大小与preferredSizes相比。如果您阅读了大多数布局管理器的javadoc和教程,您会发现他们最喜欢的是首选大小。有些像BoxLayout一样,也会考虑最大尺寸和最小尺寸。