TMGridBagLayoutについて
はじめに
Java 8でJava FXが標準ライブラリ扱いとなりましたが、今でもSwingを使う人はたくさんいます。私もJava FXの基本的なGUI部品(TreeView等)がまだ扱いづらいと感じていて、未だに積極的に使おうという気分になれません。今でも、簡単なGUI部品ならSwingで済ませてしまいます。
Swingでは画面にGUI部品を配置するにはレイアウトマネージャ(java.awt.LayoutManager2の実装クラス)を使うわけですが、自分が満足に使えるものがJava標準ライブラリにはありません。GridBagLayoutもちょっと今ひとつです。
というわけで、レイアウトマネージャを作りました。
TMGridBagLayoutのご紹介
自作レイアウトマネージャは、GridBagLayoutとGridBagConstraintsを拡張したようなものです。TMGridBagLayout と TMGridBagConstraints をGistにあげました。サンプルもあります。Java 8以降で動作します(Stream APIを使っているので…)。
そこにあるサンプルを起動すると、次のようなウィンドウが表示されます。
そのウィンドウの幅を伸長すると、次のようになります。JLabelやJButtonのサイズは常に不変ですが、JTextFieldだけはウィンドウ幅に合わせて幅が自動的に伸縮されます。
TMGridBagLayoutの使い方
java.awt.GridBagLayoutとjav.awt.GridBagConstraintsと同じ要領で、TMGridBagLayoutとTMGridBagConstraintsを組み合わせて使います。
まず、画面をグリッドに分割して考えます。上のサンプルでは、下図のように縦3×横3のグリッドにGUI部品を配置しています。なお、丸数字の1は、ウィンドウの幅に合わせて伸縮する横グリッドの番号です。他のグリッドは伸縮しません。
このような方法でGUI部品を配置するには、次のようにTMGridBagLayoutを用意します。第1引数と第2引数ではグリッドは3×3であることを指定しています。第3引数では横1番目のグリッドの幅を伸縮可能であることを指定し、第4引数では縦はどのグリッドも伸縮しないよう-1を指定しています。
TMGridBagLayout layout = new TMGridBagLayout(3, 3, 1, -1);
そして、パネルにGUI部品を追加するときに、TMGridBagConstraintsを次のようにして使います。
add(new JLabel("Item1: "), new TMGridBagConstraints(0, 0, 1, 1));
add(new JTextField() , new TMGridBagConstraints(1, 0, 2, 1));
add(new JLabel("Item2: "), new TMGridBagConstraints(0, 1, 1, 1));
add(new JTextField() , new TMGridBagConstraints(1, 1, 2, 1));
add(new JButton("Button"), new TMGridBagConstraints(2, 2, 1, 1));
たとえば、2つ目のJTextFieldの追加では、「new TMGridBagConstraints(1, 1, 2, 1)」としていますが、これは横1番め、縦1番目のグリッドに、幅2、高さ1で配備するように指示しているわけです。
説明は以上ですが、ぜひ、使っていただき、便利さを理解していただけたらと思います。ソースは自由に改変・配布してもOKです。