はじめに
Javaを初めて覚えようとするとき、多くの人はどのような順番に学習していくでしょうか。Java文法、基本的なクラスライブラリ、ファイルの入出力やスレッド、そしてAWT/Swing。大体、このあたりまで一通り使えるようになったところで、「そろそろビギナー卒業かな?」と思うのではないでしょうか。
が、「一通り覚えた」と「マスターした」は大きく違います。中でも、特に注目してほしいのが、Swingです。Swingは非常に大きなライブラリであり、そう簡単にマスターできるものでもありません。が、「AWTの強化版だろう」ぐらいなつもりで、JButtonやJFieldなど主なコンポーネントとイベント関係を一通り使ってみて「わかった、わかった!」と通過してしまった人は意外に多いんじゃないでしょうか。
こうした「通り一遍にSwingを通り過ぎてしまった人」のために、もう一度改めてSwingの機能をおさらいしていこうと思います。
対象読者
- Javaの基本機能は一通り覚えた、というビギナーを卒業しかけている人。
- Swingはマスターした? といわれると、ちょっと自信がない人。
- これからはクライアントサイドが注目されると信じている人。
JFrameへの組み込み
皆さんは、Swingと言うとどのようなイメージを持っているでしょうか。高機能だがAWTより面倒、と思っている人、多いんじゃないでしょうか。では、まずコンポーネントの組み込みあたりから見ていくことにしましょう。
package jp.codezine; import java.awt.*; import javax.swing.*; public class SampleApp extends JFrame { private static final long serialVersionUID = 1L; private JLabel label; public SampleApp(){ this.setSize(new Dimension(300,200)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label = new JLabel("Hello"); label.setFont(new Font("Serif",Font.PLAIN,28)); this.add(label,BorderLayout.CENTER); } public static void main(String[] args) { new SampleApp().setVisible(true); } }
非常に単純なSwingアプリケーションの例です。単にJLabelを組み込んで表示しているだけです。が、中には「何か違う」と感じた人もいるんじゃないでしょうか。まず、コンポーネントの組み込みにthis.add
としています。getContentPane
がない、と思った人。JavaSE 5.0より、JFrameへの組み込みはコンテントペインではなく、JFrameに直接組み込むことが可能になっています。
では、コンテントペインはなくなったのか? いえいえ、そうではありません。this
にadd
するとコンテントペインにコンポーネントが組み込まれるように機能修正されているのです。実際にはコンテントペインにコンポーネントは組み込まれているけれど、それをあたかもJFrameに直接組み込んであるかのように扱うことができる、というわけです。
もちろん、互換性の観点から、従来どおりthis.getContentPane().add
としても問題なく動きます。
使ってますか? BoxLayout
コンポーネント類は、レイアウトマネージャを元にしてレイアウトされます。レイアウトの方式を変えるには、このレイアウトマネージャを変更すればいい――このあたりはSwingでもAWTでも同じです。が、実はSwingにはAWTとは異なる部分があります。それは、「Swing専用のレイアウトマネージャがある」という点です。レイアウトマネージャはAWTと共通、と思い込んでいる人、いませんか?
package jp.codezine; import java.awt.*; import javax.swing.*; public class SampleApp extends JFrame { private static final long serialVersionUID = 1L; public SampleApp(){ this.setSize(new Dimension(300,200)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); BoxLayout boxlayout = new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS); this.setLayout(boxlayout); for(int i = 0;i < 5;i++){ JButton btn = new JButton("button" + i); btn.setFont(new Font("Serif",Font.PLAIN,18)); this.add(btn); } } public static void main(String[] args) { new SampleApp().setVisible(true); } }
これは、BoxLayoutというレイアウトマネージャを使った例です。このBoxLayoutは、JavaSE 5.0から用意されている新しいレイアウトマネージャです。
BoxLayoutは、縦一列や横一列にコンポーネントを並べるときに便利です。例えば、ツールパレットのようなものを作るときには重宝します。「GridLayoutがあるじゃないか」と思われた人。GridLayoutは、組み込むコンポーネントの個数が決まっていないときには少々不便でしょう?
このBoxLayoutは、次のような形でインスタンスを作成します。
new BoxLayout( [コンテナ] , [並び順] );
第1引数には、BoxLayoutを組み込むコンテナを指定します。 ここでは、this.getContentPane
が指定されていますね。このとき注意すべきは「コンテナの指定はthis
ではダメ!」ということでしょう。コンポーネントの組み込みなどはthis.add
でよかったので「じゃあ、これもthis
でいいのか」と思いがちですが、this.add
での組み込み先は、実際にはthis
ではなくコンテントペインです。
第2引数には、並び順の方式を示すint値が指定されます。これは、BoxLayoutに用意されているstaticフィールドを指定します。ここでは、縦一列に並べるY_AXISを指定してあります。この他のものを使うことで縦一列にしたり、折り返し表示させることも可能です。