Java Swing:为JDialog设置固定的窗口大小

Java Swing:为JDialog设置固定的窗口大小,java,swing,layout,jdialog,preferredsize,Java,Swing,Layout,Jdialog,Preferredsize,我尝试了setPreferedSize和setSize方法,但对话框仍然以最小大小打开 private void method() { commandDialog.setPreferredSize(new Dimension(100,100)); - - - - - - //Components added to dialogPanel commandDialog.add(dialogPanel); // Tried this as well:

我尝试了setPreferedSizesetSize方法,但对话框仍然以最小大小打开

private void method() {
    commandDialog.setPreferredSize(new Dimension(100,100));
    - - - 
    - - -   //Components added to dialogPanel

    commandDialog.add(dialogPanel);

    // Tried this as well: commandDialog.setSize(40, 40);     
    commandDialog.validate();
    commandDialog.setVisible(true);
}

setVisible(true)
之前,不要忘记在对话框上调用
pack()

此外,这里的许多人会建议,与其设置对话框的preferredSize,不如覆盖它或其内容窗格的
getPreferredSize()
方法,作为一种更干净、更安全的方法,使其正确调整大小


编辑
霍尔格张贴:

如果只用于返回相同的常量大小,则重写getPreferredSize()并不是更好

我想我们都同意,通常应该避免让
getPreferredSize()
返回一个哑常量大小(尽管它是稳定的)。大多数情况下,我避免设置size/preferredSize或重写getPreferredSize,而是尝试让我的组件和它们自己的首选大小以及布局管理器都自行调整大小,这同样是由
pack()
方法启动的。有时,我需要更积极地尝试设置组件的大小,例如,如果我需要将组件大小设置为背景图像,那么我将覆盖
getPreferredSize()
,并使用图像尺寸作为返回的尺寸,或者使用某种类型的程序逻辑来帮助确定最佳尺寸。但我们都可以再次同意,你越少接受这个,越好


编辑2
霍尔格张贴:

。。。但问题是关于JDialog和对话框的,它们从来不会自动适应自己喜欢的大小

同样,当您对它们调用
pack()
时,它们和所有顶级窗口都会这样做。这就是为什么我推荐这个,为什么这是我对他的问题的主要回答。

你试过了吗

commandDialog.setSize(new Dimension(100, 100));
commandDialog.setResizable(false);

+1,
setPreferredSize(Dimension)
实际上并不是一种邪恶;)但是重写
getPreferredSize(Dimension)
允许我们调整与其内容相关的首选大小。如果不需要调整,我看不出
setPreferredSize(dimension)
:)@sage有任何问题,但如果您使用
setPreferredSize
可以降低组件的效率,以根据其运行平台的变化进行调整……这是我的前任所做的,我仍在尝试修复(即使在3年之后),所以是的,
getPreferredSize
在没有经验和没有受过教育的人手中是邪恶的-如果它只是用来返回相同的常量大小,IMHOOverriding
getPreferredSize()
也不会更好。@Holger,我想是什么疯子(程序员)在说,实际上,我们几乎每次都需要根据内容调整首选大小。特别是设置文本组件的首选大小在大多数情况下是不可行的@Hovercraft满是鳗鱼:我想,我们在这里有一点误解。您讨论的是组件的一般规则,但问题是关于
JDialog
,对话框永远不会自动适应其首选大小。无论是使用
pack
还是
setSize
,它们都会显式调整大小。我从不对组件使用
setPreferredSize
,很少覆盖
getPreferredSize
。但是对于窗口和对话框,我在看起来合理的地方使用
setSize
。它们是特别的:当用户调整它们的大小时,他也会覆盖首选的大小。许多事情最好不要尝试,其中一些是您建议的:检查另一个答案below@tintinmj:因为它不尊重布局管理器首选的大小,这通常会弄乱GUI的显示。您需要
pack()
请求所有布局管理器递归地布局它们的子项,通过这样做,将忽略
setSize()
设置的大小。底线是:你不应该建议这样做。@Holger:同样,pack不使用通过
setSize(…)
方法设置的硬编码大小。@Holger:这更好,因为95%的布局管理器在调整组件和最终GUI的大小时都会使用这种方法,但它有危险,因为它可能被其他编码器覆盖。这就是为什么这里的许多人,包括这个网站上的Swing大师之一和SwingX实用程序的作者之一kleopatra,建议重写
getPreferredSize()
方法。@tintinmj:setResizeable(false)的风险已经说明。所以你接受了@Hovercraft的答案。你做了什么来克服你的问题。请添加该选项,以便将来的读者可以从中获得帮助。在
setVisible(true)
之前调用
pack()
解决了我的问题。那么为什么要更改已接受的答案?我不知道你为什么接受我的答案,尽管@hovercraftfullofel的答案很完美。