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行目以下が実行されることになります。