setLayout(レイアウトマネージャ)というメソッドの引数でレイアウトを指定するというのが基本的記述作業でしたが
引数に「null」を設定するとレイアウトマネージャを使わないレイアウトという配置ができる
ではその場合、各部品の相対位置(配置デザイン)はどうするのか
各部品ごとに定義されている(JFrameにもある)「setBounds()」というメソッドがあり引数も単純な座標指定のものから座標管理クラスまでさまざまな定義されている。
その中でもRectangleクラスオブジェクトを引数にするものがあり、中心座標(左上隅の座標)と幅と高さの値を設定できる。
しかし座標定義というものはコンピュータは得意なので優先的に使用するが、我々は座標をイメージや相対位置だけで定義するためこの方法で値を間違えると部品が重なって最悪隠れてしまう。
このためマニアックなこだわりであえてsetLayout(null);で挑戦するのもありといえばアリである。
■GridBagLayoutクラス
このレイアウトマネージャは自動生成等で利用されるものなので基本的に利用頻度は低いです
配置設定が複雑すぎるのが特徴かもしれない。
その複雑な配置方法がこれである。
このクラスとGridBagConstraintsクラスという支援クラスでこのレイアウトは完成する
GridBagConstraintsクラス:「gridx」と「gridy」で幅と高さをそれぞれ設定できる
setConstraints(コンポーネント, GridBagConstraintsオブジェクト)メソッド
GridBagConstraintsオブジェクトに設定されている幅と高さにGUI部品を設定(実装ではないことに注意)
■サンプル
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUIGridBagLayout extends JFrame implements ActionListener{
public static void main(String[] args){
GUIGridBagLayout frame = new GUIGridBagLayout();
}
public GUIGridBagLayout(){
setSize(700,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("GridBagLayout");
setVisible(true);
GridBagLayout layout = new GridBagLayout();
JPanel panel = new JPanel(layout);
GridBagConstraints gbc = new GridBagConstraints();
JButton btn = new JButton("ボタンその1");
gbc.gridx = 0;
gbc.gridy = 0;
layout.setConstraints(btn, gbc);
btn.addActionListener(this);
panel.add(btn);
btn = new JButton("ボタンその2 1よりも大きい");
btn.setFont(new Font("Serif", Font.PLAIN, 30));
gbc.gridx = 1;
gbc.gridy = 0;
layout.setConstraints(btn, gbc);
btn.addActionListener(this);
panel.add(btn);
btn = new JButton("ボタンその3 一番小さいです");
gbc.gridx = 1;
gbc.gridy = 1;
layout.setConstraints(btn, gbc);
btn.addActionListener(this);
panel.add(btn);
this.add(panel, BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e){
String cmd = e.getActionCommand();
JOptionPane.showMessageDialog(null, cmd);
}
}
実行結果
ソースコードを見るとわかるのですがわざわざレイアウトマネージャのオブジェクトをつくってJPanelのコンストラクタでレイアウト設定している
これは配置場所の設定と配置をするクラスが別なためです。
いつものメッセージボックスでは芸がないので今回はFontクラスを使ってみました
APIを見て検討した結果
第1引数:"Serif"⇐日本語が文字化けしない(他にはSansSerif、Monospaced、Dialog、DialogInputが文字化けしない):フォント名
第2引数:Fontクラスのstatic修飾のフィールド変数「PLAIN」、「BOLD」、「ITALIC」を指定:それぞれ 普通、太字、斜体といった文字のスタイル
第3引数:サイズ⇐GUI部品も連動して相対的大きくなるので設定とプログラム実行を繰り返してデザインを確認しながら決めるとよい
次回やるCardLayoutクラスはあまり使用する機会が少なく、個人的には1番アプリケーションらしいレイアウトです。