久々に技術話題をしよう。
Javaでプログラミングするのは久々だねぇ~^^
最近、自作したH8/3664Fのテストボードを操作するために使うだけさ。
VisualStadioは正直欲しいけど値段がなぁー・・・。
さてと、
複数のレイアウトを使いたいと思ったことはないかね?
このやり方は、すでにあるかもしれないけど私なりのやり方を載せる。
例えば、こういうダイアログボックスを作ってみようか。

実はこのダイアログボックス、「FlowLayout」「GridLayout」の2つのレイアウトを使っているのだ。
フレーム以外のサイズ設定は一切しておりません!
FlowLayoutは、規定の大きさの部品をフレーム上に詰めていくしかない。
GridLayoutは、分割されたフレームいっぱいに部品を広げて表示してしまう。
互いに使えそうで、大げさな表示をしてしまう欠点はあるのだ。
処理の流れは、
2つのクラスを定義する。
JDialogを継承したダイアログのクラス、
JPanelを継承した埋め込み用パネルのクラス。
2種類上のレイアウトは抱合関係によって実現できるのだ。
よって、クラスごとに分けるとする。
いくつかメソッドも使用するので、そのほうが都合がいいのだ。
JDialogのクラス内でJPanelを使います。
そこでは、GridLayoutを使用します。
GridLayoutはただ部品の配置を教えるだけです。
// 2行1列のGridLayoutを使用します
class MyDialog extends JDialog .....
...........
JPanel jp = new JPanel(new GridLayout(2,1));
addによってコンポネントを追加するのが普通ですね!
JLabel lbl = new JLabel("ダイアログボックス!");
JButton btn_on = new JButton("OK");
...
jp.add(lbl);
jp.add(btn_ok);
this.add(jp);
this.setVisible(true);
というふうに記述すれば、普通にGridLayoutで表示されます。
GridLayout(2,1)のみ使用した場合はこれ↓

これじゃ、ぜんぜんダイアログボックスぽっくないですね~。
じゃ、FlowLayoutのみだとどうなる?
↓こうなります。

さきほど言ったJPanel抱合によって両方の利点を
取ることができます。
GridLayoutのひとつのセル内にFlowLayoutを表示すればいいわけだから
JPanelで継承させたクラスに、FlowLayoutを記述します。
同じように
addでコンポネントを入れて、最後にsetVisible(true)で
JPanelの表示をするよう促します。
その作成したクラスをダイアログボックスのクラス
GridLayoutで指定したJPanelのaddでコンポネントとして追加すればいいわけです。
ソースコードはこちら↓
/* コンポネントにレイアウトを適用するクラス */
class InPanel extends JPanel {
public InPanel(LayoutManager layout,Component comp){
super(layout);
this.add(comp);
this.setVisible(true);
}
}
/* ダイアログボックス用 */
class MyDialog extends JDialog implements ActionListener{
private static JButton btn_ok;
private static JLabel lbl;
private static JPanel jp1;
public MyDialog(JFrame parent,boolean mode,String lab){
super(parent,"Warning!",mode);
jp1 = new JPanel();
this.setLocation(parent.getX()+100, parent.getY()+100);
this.setSize(210,100);
jp1.setLayout(new GridLayout(2,1));
lbl = new JLabel(lab);
btn_ok = new JButton("OK");
btn_ok.addActionListener(this);
/* 何かボタンを押したら閉じる */
btn_ok.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e) {
setVisible(false);
}
});
/* lblというコンポネントをFlowLayoutとして追加 */
jp1.add(new InPanel(new FlowLayout(FlowLayout.CENTER),lbl));
/* btn_okというコンポネントをFlowLayoutとして追加 */
jp1.add(new InPanel(new FlowLayout(FlowLayout.CENTER),btn_ok));
/* Xボタンをクリックすると閉じる */
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
}
});
this.add(jp1); //パネル情報をフレームに追加
this.setResizable(false); //フレームのサイズ変更禁止
this.setVisible(true); //フレームを表示する
}
public void actionPerformed(ActionEvent e) { //OKをクリックしたら閉じる
setVisible(false);
}
}
JFrameはswingアプリならなんでもご自由に!
テーマ : プログラミング
ジャンル : コンピュータ