簡単なGUI作品制作例 電卓 ステップ2 (ボタン配置)

次のクラス図は、前のページ)で 作成したものです。
ここで実験すると分かりますが、現在のSimpleCalcPanelのレイアウト(配置)方法は、 サイズが変更されたとき、自動的に部品が流れる(flow)よう再配置されるFlowLayoutです。
これを、setLayout(null);でレイアウト無しにし、 全体のサイズから計算した値で、各配置部品の位置とサイズをsetBounds命令で次のように 配置するよう変更します。

このボタンの配置を行う 以下のlayoutメソッドを、SimpleCalcPanelクラスに追加します。 このメソッドの引数apertureの情報でボタンとボタンの間に隙間を作ります。
パネルサイズと隙間のパラメタから、一つのボタンの高さ(height)幅の(btnW)を 算出し、各部品を配置します。

	public void layout(int aperture){// 隙間の幅を指定して並べる
		this.setLayout(null); //レイアウトなし
		int w = this.getWidth();// 幅取得
		int h = this.getHeight();// 高さ取得
		int height = (h - aperture * 7)/6;//一つの部品の高さ(7箇所の隙間に6つ並べる)
		int y = aperture;
		this.lbl1.setBounds(aperture, y, w-aperture*2, height);
		
		int btnW = (w - aperture * 5)/4; //一つのボタン幅
		int x;
		
		y += height + aperture; // 次の行へ
		x = aperture;
		this.btnNumb[7].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnNumb[8].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnNumb[9].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnOp[1].setBounds(x, y, btnW, height);
		int xEnd = x + btnW;//右端ボタンの右端座標

		y += height + aperture; // 次の行へ
		x = aperture;
		this.btnNumb[4].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnNumb[5].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnNumb[6].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnOp[2].setBounds(x, y, btnW, height);
		
		y += height + aperture; // 次の行へ
		x = aperture;
		this.btnNumb[1].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnNumb[2].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnNumb[3].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnOp[3].setBounds(x, y, btnW, height);

		y += height + aperture; // 次の行へ
		x = aperture;
		this.btnNumb[0].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnNumb[10].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnOp[0].setBounds(x, y, btnW, height);
		x += btnW + aperture;
		this.btnOp[4].setBounds(x, y, btnW, height);

		y += height + aperture; // 次の行へ
		x = aperture;
		this.txt1.setBounds(x, y, 160, height);
		x += this.txt1.getWidth() + aperture;
		this.btnOp[5].setBounds(x , y, (xEnd - x), height);
	}

この実行は、SimpleCalculatorクラスのコンストラクタで 次のように行います。

package work;

import java.awt.BorderLayout;
import java.awt.Container;// 入れ物のクラス
import javax.swing.*;

public class SimpleCalculator extends JFrame {
	Container container = getContentPane();
	SimpleCalcPanel panel = new NomalCalcPanel();
	
	public SimpleCalculator() {
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setTitle("SimpleCalculator");

		this.container.add( panel, BorderLayout.CENTER);

		this.setResizable(false);//ユーザがこのフレームのサイズを変更できなく設定します。//【4】

		this.setBounds(0, 0, 250, 250);//フレームサイズ指定
		this.setVisible(true);

		this.panel.layout(5);//部品の隙間を5にして配置
		this.validate();
		
		this.setAlwaysOnTop(true);//ほかのすべてのウィンドウの手前に表示されるように、最前面ウィンドウへ設定します
	}
	
	public static void main(String[] args) {
		JFrame f = new SimpleCalculator();
	}
}

this.validate();は、表示後に コンテナへの追加または削除、レイアウト関連の情報の変更を行った時に 呼び出す必要があります。
次のボタンで、フレームのサイズを変更して実行できます。