Java の pack()メソッド
 
Java の Window クラスで定義されている pack() メソッドは、フレームの内容が適切なサイズ以上になるようにフレームのサイズを設定します。
フレームサイズを明示的に定義することで、pack() メソッドを置き換えることができます。これを行うには、setSize() または setBounds() メソッドを使用します。setBounds() メソッドは、フレームの場所も設定します。
ただし、これらのメソッドは、pack() メソッドとは異なり、フレームレイアウトマネージャーにフレームサイズの管理を任せません。フレームレイアウトマネージャーは、コンポーネントのサイズに影響を与えるさまざまなプラットフォームやその他の要因に適応できます。したがって、pack() メソッドを使用することをお勧めします。
構文:
public void pack()
pack() メソッドは、すべてのコンポーネントをバインドします。それがどのように機能するかを確認するために、実際の例を見てみましょう。クリックするとテキストフィールドにテキストを返すボタンを作成します。
import java.awt.event.*;
import javax.swing.*;
public class ButtonDemo {
  public static void main(String[] args) {
    JFrame jf = new JFrame("Button Example");
    final JTextField tf = new JTextField();
    // using setBounds() method for textfield
    tf.setBounds(50, 50, 150, 20);
    JButton b = new JButton("Click this button");
    // using setBounds() method for Button
    b.setBounds(50, 100, 95, 30);
    b.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        tf.setText("Java is interesting.");
      }
    });
    jf.add(b);
    jf.add(tf);
    jf.setSize(300, 300);
    jf.setLayout(null);
    jf.setVisible(true);
  }
}
出力:

この例では、pack() メソッドを使用していないことに注意してください。代わりに、setBounds() メソッドを使用します。テキストフィールドの setBounds() メソッドの引数は 50, 50, 150, 20 であり、ボタンの引数は 50, 100, 95, 30 です。
また、ボタンではテキスト全体を表示できないことに注意してください。これについても、以下のセクションで説明します。レイアウトマネージャーは、追加されたコンポーネントのサイズと位置を自動的に設定することを知っています。
pack() メソッドはレイアウトマネージャーがフレームを担当するメソッドであるため、setBounds() メソッドがない場合は使用する必要があります。
Java での SetBounds() メソッドの使用
pack() メソッドの代わりにこれを使用するには、メインウィンドウ内のコンポーネントの位置とサイズを指定するための引数を渡す必要があります。
4つの引数を取ります。最初の 2つは、コンポーネントの position(top-left) を指定するためのものであり、最後の 2つは、コンポーネントの size(width-height) を指定するためのものです。
構文:
setBounds(int x - coordinate, int y - coordinate, int width, int height)
上記の例の次のコードを見てください。
jf.setLayout(null);
setBounds() メソッドを使用する場合、layout manager を null に設定します。
Java での Pack() メソッドの使用
次に、pack() メソッドを使用するもう 1つの例を見てください。
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {
  public ButtonDemo() { // This is the name of the class
    // This will appear in the title bar of output window
    setTitle("Buttons using pack()");
    setLayout(new FlowLayout());
    setButton();
    // This calls the pack method
    pack();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
  }
  void setButton() {
    for (int i = 1; i < 9; i++) {
      add(new JButton("Button" + i));
    }
  }
  public static void main(String args[]) {
    new ButtonDemo();
  }
}
出力:

この例では、コンポーネントの位置とサイズを設定するために setBounds() メソッドを使用していません。代わりに、pack() メソッドを呼び出します。このメソッドは、コンポーネントのサイズと位置を独自に処理します。
ここで、ButtonDemo クラスは JFrame クラスを拡張します。JFrame クラスは、ボタン、ラベル、テキストフィールドなどの GUI のさまざまなコンポーネントを保持するためのウィンドウとして機能するコンテナです。
また、for ループの代わりに次のコードを使用できますが、コードの長さが不必要に長くなります。
JButton b1 = new JButton("Button 1");
JButton b2 = new JButton("Button 2");
JButton b3 = new JButton("Button 3");
JButton b4 = new JButton("Button 4");
JButton b5 = new JButton("Button 5");
JButton b6 = new JButton("Button 6");
JButton b7 = new JButton("Button 7");
JButton b8 = new JButton("Button 8");
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b6);
add(b7);
add(b8);
Java を使用してフレームを作成する方法の詳細については、このドキュメントを参照してください。
pack() メソッドを削除すると、出力が得られますが、ボタンはパネルのサイズを変更した場合にのみ表示されます。これは、pack() または setBounds() メソッドを使用しない場合の出力です。

サイズを変更してボタンを表示できます。

ただし、これは適切な表現ではないため、pack() または setBounds() メソッドのいずれかを使用する必要があります。pack() メソッドは使いやすく正確であり、たった 1 行のコードで目的を果たします。
setBounds() メソッドには、引数として x 座標と y 座標が必要です。一度に座標を決定するのは簡単ではないことが多いため、これには多くの変更と再調整が必要になる場合があります。
また、pack() メソッドはそれに応じてボタンのサイズを調整しますが、setBounds() メソッドはそれ自体ではそれを行うことができません。ボタン内のさまざまなテキストの長さに対して、幅と高さについてさまざまな引数を渡す必要があります。
最初の例の出力をもう一度見てください。

ボタンのサイズがこのテキストの要件よりも小さいため、ボタンは完全なテキストを表示できませんこのボタンをクリックしてください。これを修正するには、width 引数の値を変更する必要があります。
ただし、pack() メソッドを使用すると、ボタン内のテキストに従ってボタンのサイズが自動的に変更されます。
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {
  public ButtonDemo() {
    setTitle("Using the pack() method");
    setLayout(new FlowLayout());
    setButton();
    // Calling the pack() method
    pack();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
  }
  void setButton() {
    for (int i = 1; i < 7; i++) {
      add(new JButton("Click this Button" + i));
    }
  }
  public static void main(String args[]) {
    new ButtonDemo();
  }
}
出力:

手動でサイズを変更しなくても、テキスト全体がボタンの内側に収まることに注意してください。これは、setBounds() メソッドよりも pack() メソッドを使用する利点です。
Swing を使用した GUI の作成について詳しくは、このドキュメントを参照してください。
まとめ
pack() メソッドはレイアウトマネージャーを担当させ、パネル上のコンポーネントのサイズを変更して適切に配置します。
pack() メソッドの代わりに setBounds() メソッドを使用できますが、setBounds() とは異なり、それ自体で変更に簡単に調整できるため、pack() メソッドの使用をお勧めします。pack() メソッドは、すべてのコンポーネントをバインドするために必要です。