イベントドリブンと swing

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


swingとは

Javaで、ウインドウアプリケーションを作成するための方法には大きく分けてAWTswingがあります。今回は 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を利用する

ただのウインドウが表示されます。

幾つか、初登場のメソッドがあります。これらについて雰囲気だけ掴んでいただければ問題ないです。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行目以下が実行されることになります。

最終更新: 2014/08/01 , 公開: 2013/03/09
▲top