添加新组件时更新(和增长)对话框

时间:2015-07-16 22:31:02

标签: java swing layout

我有JDialog窗口,用户可以使用“+”旋钮手动添加组件。

我想在每次添加后自动调整窗口大小。

pack()在对话框设置为可见之前有效。但它已经可见,它不会改变de windows维度。

pack()是否有替代/补充方式?

亲切的问候,

2 个答案:

答案 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();
}