質問: new Panel1(); add(p1); } } ``` ``` コード public class Panel1 extends JPanel{ public PlayerPanel(){ setBackground(Color.GREEN); //setSize(1000, 800); } } ``` 上のプログラムを実行すると、一面灰色で真ん中の上部に緑色の小さな正方形が描かれていました。 アプレットサイズ?は1000,800に設定しているのでその大きさの画面が出てくるのですが、BasePanelは大きさを設定してないのに一面灰色になりました。 またPanel1も大きさの設定をしていないのに今度は小さい緑色の四角形が描かれました。 Panel1でコメントアウトをやめて、大きさを設定しても小さい緑色の四角形が描かれました。 疑問点として 1. なぜBasePanelは大きさを設定していないのに1000*800(一面)が灰色になったのか? 2. なぜPanel1は大きさを設定してもしなくても小さい四角形しか描かれないのか? 3. Panel1を1000*800(一面)に描くにはどうすればいいのか? こちらの3点教えていただきたいです。 よろしくお願いします。
回答: > > 1. なぜBasePanelは大きさを設定していないのに1000*800(一面)が灰色になったのか? > > > Swingにはレイアウトマネージャーという仕組みがあり、レイアウトマネージャーの種類で自動的にコンポーネントを配置する方法を選択できます。 `JApplet`のデフォルトのレイアウトマネージャーは`BorderLayout`というもので、コンポーネントを1つだけ設定した場合はそのコンポーネントが最大サイズで表示されます。 > > 2. なぜPanel1は大きさを設定してもしなくても小さい四角形しか描かれないのか? > > > `JPanel`のデフォルトのレイアウトマネージャーは`FlowLayout`というもので、これはコンポーネントを最小限の大きさで横に並べて表示するものです。 `BorderLayout`も`FlowLayout`も、相対的にレイアウトを決めるタイプのレイアウトマネージャーなので、サイズを固定の数値で指定することは基本的にできません。 > > 3. Panel1を1000*800(一面)に描くにはどうすればいいのか? > > > `BasePanel`のコンストラクターで、 ``` setLayout(new BorderLayout()); add(p1, BorderLayout.CENTER); ``` とすれば、緑が全体に表示されるようになります。 相対レイアウトを無効にしたい場合は、それぞれのコンポーネントで`setBorderLayout(null)`を設定します。 その場合、各コンポーネントのサイズは明示的に指定する必要があります。