画面の構成を変化させたとき(コンポーネントの適切な大きさが変化したとき)、swingのコンポーネント階層の制約を適切に設定していれば「自動的にコンポーネントのレイアウトが再計算されレイアウトが自動調整されるのですが、場合によっては明示的な再配置が必要になる場合があります。
ウィンドウの大きさ自体が変化するような場合はこれを用います。JFrameもWindowの派生クラスですからpack()が使えます。
コンポーネントのレイアウトのし直しを明示的に指示するにはこれを使います。
上記で期待通りの結果を得るためには、swingのレイアウトの「正しい方法」を知っておく必要があります。もしウィンドウのサイズや各コンポーネントのサイズや位置を「明示的に指定する」というやり方でレイアウトしているのであればpack()やrevalidate()を呼び出しても期待通りの結果を得られず、却ってレイアウトがくずれてしまうこともあります。
大雑把に言えば次のような点を注意しておくとよいと思います。
- 適切なレイアウトマネージャーを用いる
- 大きさは制約として与える
setMinimumSize, setPreferredSize, setMaximumSizeなどを用います。setBounds, setSize, setLocationは基本的に用いません。
- JFrameの画面の初期化コードの最後にはpackを呼び出す
これをやっていないサンプルは(個人的には)swingのレイアウトを正しく示しているものとはいえないと思います。
詳細については以下のようなページが参考になります。
優れたGUIを構築する
今現在swingはJavaの標準ではなくなりましたが、この記事に書かれている「GUIのレイアウト戦略の考え方」については最新のJavaFXにも通じる部分があると思います。
質問者さんのコードとは若干異なりますが、簡単な例を挙げておきます。
java
1public class MyAppFrame extends JFrame {
2 public static void main(String[] args) {
3 new Zong().setVisible(true);
4 }
5
6 MyAppFrame() {
7 super("title");
8 setDefaultCloseOperation(EXIT_ON_CLOSE);
9
10 Box box = Box.createVerticalBox();
11 getContentPane().add(box, BorderLayout.CENTER);
12
13 JLabel label = new JLabel("no image");
14 box.add(label);
15
16 JButton button = new JButton("set");
17 box.add(button);
18 button.addActionListener(ev -> {
19 label.setIcon(new ImageIcon(getClass().getResource("big-image.png")));
20 label.setText("");
21 pack(); //ウィンドウの大きさも含めてレイアウトを再計算
22 });
23
24 pack();
25 }
26}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。