次のクラス図は、前のページ
()で
作成したものです。
ここで実験すると分かりますが、現在の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();は、表示後に
コンテナへの追加または削除、レイアウト関連の情報の変更を行った時に
呼び出す必要があります。
次のボタンで、フレームのサイズを変更して実行できます。