8

私は持っJFrameていGridBagLayoutます。ユーザーはこのウィンドウのサイズを変更できます。また、ウィンドウ サイズを変更する編集操作を実行することもできます。私は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();

しかし、私はこの解決策がまったく好きではありません。醜いコードのほかに、サイズを 2 回設定します (1 回はパックで、もう 1 回は直接ではありません)。他の解決策はありますか?

4

3 に答える 3

13

簡単な解決策は、次のようなものを使用することです。

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

これによりpack()、ウィンドウを小さくすることはできず、大きくすることしかできないと思います。最小サイズを後で再設定することによりnullpack()ユーザーが後でサイズを小さく変更するのを防ぐことができます。

最後には必要ありません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 に答える