8

JFrameGridBagLayout。用户可以调整此窗口的大小。此外,他还可以执行一些更改窗口大小的编辑操作。我pack(); repaint();现在在进行此类操作后使用。但是,实际上我不应该在这样的操作之后让窗口变小 - 只有更大。我发现的解决方案是

    Dimension oldSize = getSize();
    pack();
    Dimension newSize = window.getSize();
    setSize(
            (int) Math.max(newSize.getWidth(), oldSize.getWidth()),
            (int) Math.max(newSize.getHeight(), oldSize.getHeight()));
    repaint();

但我根本不喜欢这个解决方案。除了丑陋的代码之外,我们设置了两次大小(一次通过包,而不是直接)。还有其他解决方案吗?

4

3 回答 3

13

一个简单的解决方案是使用这样的东西:

frame.setMinimumSize(frame.getSize());
frame.pack();
frame.setMinimumSize(null);

我认为这不会让pack()窗口变小,只会变大。通过将最小尺寸重置为null之后,pack()我们可以避免阻止用户在之后将其调整得更小。

最后你不应该需要 a repaint(),尺寸变化应该会自行触发重绘。(当然,要确保所有这些动作都发生在事件分派线程中。)

于 2011-06-26T18:04:30.203 回答
1

Paŭlo 提出的另一种解决方案是以下代码:

private boolean greater(Dimension left, Dimension right) {
    return left.getHeight() > right.getHeight() || left.getWidth() > right.getWidth();
}

if (greater(window.getPreferredSize(), window.getSize())) {
    window.pack();
}

此解决方案的优点是除非必要,否则不会调用 pack,并且它避免了我们在使用 Paŭlo 解决方案的 Linux 上观察到的闪烁。

于 2015-09-10T15:32:05.570 回答
0

你可以重写 pack() 方法来做到这一点。虽然不确定是否有更好的方法。

于 2011-06-26T18:00:27.860 回答