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

Update (and grow) dialog when new components are added

我有 JDialog window,用户可以在其中使用“+”旋钮手动添加组件。

我希望我的 window 在每次添加后自动调整大小。

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

有 alternate/complementary 方法可以 pack() 吗?

亲切的问候,

Is there a alternate/complementary way to pack() ?

不,使用 pack() 因为这是唯一一个不仅会重新布局组件而且会调整包含顶级 window(这里是 JDialog)的调用。

But it is already visible, it doesn't change de windows dimension.

window 是否已经可见并不重要。如果 pack() 在可视化顶层 Window 上被调用 (一个很大的 if),那么它 改变window 的尺寸,如果您的 GUI 正确使用了布局管理器。如果你的没有被改变,那么你可能没有在正确的参考上调用这个方法或者没有以好的方式使用布局,在这种情况下,你会想要向我们展示相关的代码。

您的问题引出了另一个问题——为什么不使用 pack()?如果是因为正在对 JDialog 持有的 JPanel 进行更改,那么您始终可以使用 SwingUtilities.getWindowAncestor(Component c) 获取对话框或任何顶层 window 持有 JPanel(或任何组件)。

由于 JScrollPane 是包的 "problem",我让 pack() 计算所有内容。如果 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();
}