Javaで、ウインドウアプリケーションを作成するための方法には大きく分けてAWTとswingがあります。今回は swingを利用して、ウインドウアプリケーションを製作します。これによって、リスナ系インターフェイスについても復習することにします。
ウインドウアプリケーションの基本となるクラスは JFrameクラスです。本節と次の節では、この JFrameクラスを拡張したクラスを作成して、ウインドウアプリケーションを製作していきます。
JFrameについて詳細が気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→JFrameクラス。
まずは JFrameクラスを継承したものの何の機能も追加していない MyJFrameクラスを作成して、そもそもウインドウアプリケーションの作り方を理解していきます。
ソースコードは以下の通り。
S201/MyJFrame.java
import javax.swing.JFrame;
/**
* JFrameを拡張したクラスです。
*/
public class MyJFrame extends JFrame {
/**
* デフォルトのシリアルバージョン ID(warning回避)。
*/
private static final long serialVersionUID = 1L;
}
S201/S201.java
import javax.swing.JFrame;
/**
* swingを利用します。
*/
public class S201 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
JFrame jFrame = new MyJFrame();
jFrame.setTitle("swing test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400, 300);
// ウインドウを表示する(新しいスレッドが生成される)
jFrame.setVisible(true);
}
}
実行結果は以下の通り。

ただのウインドウが表示されます。
幾つか、初登場のメソッドがあります。これらについて雰囲気だけ掴んでいただければ問題ないです。swingを理解することが主眼ではなく、リスナ系インターフェイスについて理解することが、本節の目的なのですから。
続いて、GUIなアプリケーションらしさということで、コンポーネントを配置します。具体的には、ボタンとラベルを配置することとします。
ソースコードは以下の通り。
S202/MyJFrame.java
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* JFrameを継承したクラスです。
*/
public class MyJFrame extends JFrame {
/**
* デフォルトのシリアルバージョン ID(warning回避)。
*/
private static final long serialVersionUID = 1L;
/**
* ボタン1。
*/
private JButton jButton1 = new JButton("朝");
/**
* ボタン2。
*/
private JButton jButton2 = new JButton("夜");
/**
* ラベル1。
*/
private JLabel jLabel1 = new JLabel("メッセージ欄");
/**
* コンストラクタ。
*/
public MyJFrame() {
// レイアウトを設定する
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
// フレームにボタンとラベルを登録する
this.getContentPane().add(this.jButton1);
this.getContentPane().add(this.jButton2);
this.getContentPane().add(this.jLabel1);
}
}
S202/S202.java
import javax.swing.JFrame;
/**
* コンポーネントを利用します。
*/
public class S202 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
JFrame jFrame = new MyJFrame();
jFrame.setTitle("swing test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400, 300);
// ウインドウを表示する(新しいスレッドが生成される)
jFrame.setVisible(true);
}
}
実行結果は以下の通り。

ウインドウ内にボタンやラベルなどのコンポーネントが配置されました。しかし、ボタンを押しても反応はありません。
ボタンを押したときに何らかの処理を行うためには、リスナを登録しなければなりません。今回は ActionListenerインターフェイスを実装したクラスのインスタンスが必要になります。今回は、処理の関係上、MyJFrameクラスが ActionListenerインターフェイスを実装することとします。
ソースコードは以下の通り。
S203/MyJFrame.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* JFrameを継承したクラスです。
*/
public class MyJFrame extends JFrame implements ActionListener {
/**
* デフォルトのシリアルバージョン ID(warning回避)。
*/
private static final long serialVersionUID = 1L;
/**
* ボタン1。
*/
private JButton jButton1 = new JButton("朝");
/**
* ボタン2。
*/
private JButton jButton2 = new JButton("夜");
/**
* ラベル1。
*/
private JLabel jLabel1 = new JLabel("メッセージ欄");
/**
* コンストラクタ。
*/
public MyJFrame() {
// レイアウトを設定する
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
// フレームにボタンとラベルを登録する
this.getContentPane().add(this.jButton1);
this.getContentPane().add(this.jButton2);
this.getContentPane().add(this.jLabel1);
// リスナを設定する
this.jButton1.addActionListener(this);
this.jButton2.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
Object object = e.getSource();
if(object == this.jButton1) {
this.jLabel1.setText("おはようございます");
} else if(object == this.jButton2) {
this.jLabel1.setText("こんばんは");
}
}
}
S203/S203.java
import javax.swing.JFrame;
/**
* リスナを利用します。
*/
public class S203 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
JFrame jFrame = new MyJFrame();
jFrame.setTitle("swing test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400, 300);
// ウインドウを表示する(新しいスレッドが生成される)
jFrame.setVisible(true);
}
}
実行結果は以下の通り。

ボタンを押すと、ラベルの文字が変化するようになりました。
MyJFrameクラスの 44行目、45行目にてボタンのリスナを登録したことで、ボタンが押されたときには 49行目以下が実行されることになります。