業務で使うのでJavaのSwingを勉強し始めた。ちょっと触ってみた所感としては、ゲームプログラミングみたいで楽しい。昔やってたフラッシュゲームのプログラミングに似ている。
Swingとは
Swingは、プログラミング言語JavaのGUIツールキット。同じくJavaのGUIツールキットであるAWT(Abstract Window Toolkit)を拡張したもの。
AWTはオペレーティングシステムのウィンドウシステムに準じたデザインになるのに対し、Swingで作成したGUIはJavaプログラム上で描画されるので、より柔軟な設計が可能となる。AWTに対しSwingのようなコンポーネントを軽量コンポーネントと呼ぶ。プラグイン可能なルック・アンド・フィールを持っているので、簡単にルック・アンド・フィールを切り替えることができる。またAWTには無かった、表、スライダー、スピナ、ツリー表示をするコンポーネントなど高度なコンポーネントが用意されている。
コンテナとは
Swingを使ったプログラムではベースとなるウィンドウを作成する。そしてウィンドウの中に様々な部品を追加していくことになる。
このウィンドウのような、コンポーネントを格納することが出来る機能を持った部品をコンテナ(英語では、「容器」「入れ物」を意味する)と呼ぶ。
ベースとなるウィンドウを作成するためのコンテナには主に以下の3種類がある。
- フレーム(JFrameクラス)
- ダイアログ(JDialogクラス)
- アプレット(JAppletクラス)
これらはContainerクラスのサブクラスとして定義されている。
これらのクラスからオブジェクトを作成することでベースとなるウィンドウが出来上がる。
JFrame frame = new JFrame();
コンポーネントとは
コンテナを作成したら、次にコンポーネント(英語では「構成要素」「成分」を意味する)をコンテナに追加していく。コンポーネントはJComponentクラスのサブクラスとして定義されており、ボタンやラベルなど用途に応じて数多くのクラスが定義されている。
例えば、代表的なコンポーネントであるボタンを作成するためのJButtonクラスのオブジェクトを作成してフレームに追加するには次のように記述する。
JFrame frame = new JFrame();JButton button = new JButton();frame.add(button);
また、全てのコンポーネントの親クラスであるJComponentクラスもContainerクラスのサブクラスとなっているので、コンポーネントの中には他のコンポーネントを追加することができるコンテナとしての機能を持つものもある。(ただしトップレベルコンテナにはなれないので、アプリケーションの大元としては使う事ができない)。
レイアウトマネージャとは
コンポーネントをコンテナに追加していく場合、どのように各コンポーネントを配置すれば良いだろうか。コンテナに対してレイアウトマネージャーを設定することで、後はコンテナにコンポーネントを追加するだけで自動的にレイアウトマネージャーによってどこにコンポーネントが配置されるのかが決まる。
ピクセル単位での位置の指定はできないが、その代わり自動的に適切な位置を計算してくれるので事前の細かい設計が不要となる。またOSが異なっても環境に合わせて自動的に調整を行ってくれる。
イベントとは
コンテナに配置されたボタンが押された時に何らかの処理を実行したい場合、イベントと呼ばれる機能を使用する。
アプリケーションは様々なコンポーネントから構成されているが、コンポーネントに対して利用者が何らかの操作を行った時に、その操作に応じてイベントと呼ばれるものを発行する。利用者の様々な操作に応じて別々のイベントが発行されるため、数多くのイベントが常に発行されている。数多く発行されるイベントに対して全て処理する必要はなく、例えば一つのボタンにおいて、マウスがクリックされたことだけを知りたいのであれば、そのイベントだけを受け取るように設定することが出来る。
イベントの処理手順
- ボタンが押される
- イベントが発行される
- イベントを受け取る
- 処理を実行する
コンテナ、コンポーネント、レイアウトマネージャ、イベントを使ってHello Worldを書いてみる
今回用意した環境
- Windows7
- Eclipse
- Eclipseに同梱のJDK1.8
フレームの上にボタンを表示して、ボタンをクリックすると新しいフレームが出てくるというプログラムを書いてみた。
Test.javaからCallInformationクラスを呼び出し、そこからJFrameとJButtonのラッパークラスであるNewInformationクラスとUpdateクラスを呼び出している。動作確認済みなので、このままコピペして実行確認が可能である。
Test.java
public class Test { public static void main (String[] args) { new CallInformation(); }}
CallInformation.java
import java.awt.BorderLayout;import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import DefaultButton.Update;import DefaultFrame.NewInformation;public class CallInformation implements ActionListener { public CallInformation() { NewInformation newInformation = new NewInformation(); JFrame frame = newInformation.getFrame(); frame.setTitle("仮タイトル"); frame.setBounds(200, 200, 300, 300); //X座標, Y座標, Width, Height frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); Update update = new Update(); JButton button = update.getButton(); contentPane.add(button, BorderLayout.CENTER); button.addActionListener(this); } public void actionPerformed(ActionEvent e){ NewInformation newInformation = new NewInformation(); JFrame hello = newInformation.getFrame(); hello.setTitle("Hello World"); hello.setBounds(250, 250, 300, 300); //X座標, Y座標, Width, Height hello.setVisible(true); }}
NewInformation.java
package DefaultFrame;import javax.swing.JFrame;public class NewInformation extends JFrame { private JFrame frame; public NewInformation() { frame = new JFrame("未設定のタイトル"); frame.setBounds(100, 100, 200, 160); //X座標, Y座標, Width, Height frame.setVisible(true); } public JFrame getFrame() { return frame; }}
Update.java
package DefaultButton;import javax.swing.JButton;public class Update extends JButton { private JButton UpdateButton; public Update() { UpdateButton = new JButton("更新"); } public JButton getButton() { return UpdateButton; }}
参考
Swing – Wikipedia
Swingを使ってみよう – Java GUIプログラミング