我有JDialog窗口,用户可以使用“+”旋钮手动添加组件。
我想在每次添加后自动调整窗口大小。
pack()
在对话框设置为可见之前有效。但它已经可见,它不会改变de windows维度。
pack()
是否有替代/补充方式?
亲切的问候,
答案 0 :(得分:2)
是否有替代/补充方式pack()?
不,使用pack()
,因为这是唯一不仅会重新布局组件而且会调整包含顶级窗口(这里是JDialog)的调用。
但它已经可见,它不会改变de windows维度。
窗口是否已经可见并不重要。如果pack()
在可视化的顶级窗口(大的if)上被称为,那么如果您的GUI使用布局管理器,那么<strong>将更改窗口的尺寸正常。如果你没有被改变,那么也许你没有在正确的引用上调用这个方法,或者没有以良好的方式使用布局,在这种情况下,你需要向我们展示相关的代码。
您的问题引出了另一个问题 - 为什么不使用pack()
?如果是因为正在对JDialog持有的JPanel进行更改,那么您始终可以使用SwingUtilities.getWindowAncestor(Component c)
获取对话框或任何顶级窗口保存JPanel(或任何组件)。
答案 1 :(得分:0)
由于JScrollPane是包的“问题”,我让pack()计算所有内容。如果de JScrollPane内部的面板比滚动窗格大且仍处于合理的尺寸,我会强制JDialog更大的尺寸:
pack();
Dimension dimPanels = panObjects.getSize();
Dimension dimWindow = this.getSize();
Dimension dimScroll = jScrollPane1.getSize();
int targetHeight = dimPanels.height - dimScroll.height + dimWindow.height;
if ((dimPanels.height > dimScroll.height) && (targetHeight < MAX_WINDOW_HEIGHT)) {
this.setSize(dimWindow.width, targetHeight);
validate();
}
else if (targetHeight > MAX_WINDOW_HEIGHT) {
this.setSize(dimWindow.width, MAX_WINDOW_HEIGHT);
validate();
}