JavaでSwingを利用したGUIアプリケーションの作成4(イベント処理)
Swingを利用したウィンドウの表示、ボタンやラベルの配置、テキスト入力と来たので、イベント処理を取り入れたGUIアプリケーションを作成する。
GUIアプリケーションにおいて、
- ユーザーの操作を検知する
- アプリケーションの振る舞いを状況に応じて判断する
- ユーザーの期待する処理を実行する
という一連の作業をプログラミングする必要がある。
Swingには、この一連の作業を簡単にプログラミングできるような仕組みであるイベント処理のモデル(アクション、イベント、アクション・リスナー)があらかじめ用意されている。
アクション
GUIコンポーネント(ボタン、テキストフィールド、メニュー等)に対してユーザーが行う操作を「アクション」という。
例えばボタンをクリックする、メニューを選択する等の行動を指す。
イベント
ユーザーが操作した事実およびユーザーの操作に関する情報を保持するオブジェクトを「イベント」という。
このイベントはコンポーネントに対してアクションが行われるたびに生成される。
例えばボタンAがクリックされた、ボタンBがクリックされた、メニュー「ファイル」が選択された、といったアクションを行うと、コンポーネントはその事実や情報を保持するためのクラス「java.awt.event.ActionEvent」のインスタンスを生成する。
アクション・リスナー
ユーザーの操作に応じて一定の処理を行うインターフェイスを「アクション・リスナー」という。
アクション・リスナーはインターフェイス「java.awt.event.ActionListener」であるため、具体的な処理を記述できない。
そのため、例えば音を鳴らす、ダイアログボックスを表示する、といった具体的なアプリケーションの処理はそのインターフェイスを実装した具象クラスのメソッド(actionPerformed)にプログラミングすることになる。
アプリケーションの振る舞いを実装
プロジェクトの作成
プロジェクト名「SwingSample04」を作成する。
1.[ファイル]⇒[新規]⇒[プロジェクト]を選択
2.[Javaプロジェクト]を選択し[次へ]をクリック
3.プロジェクト名等を入力し[完了]をクリック
- プロジェクト名に「SwingSample04」を入力
- プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択
クラスの作成
GUIアプリケーションの起動、コンポーネントの配置、コンポーネントのアクションに応じた処理を担当するクラス「SwingAppMain」を作成する。
1.[ファイル]⇒[新規]⇒[クラス]を選択
2.[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック
- パッケージに「swing.sample」を入力
- 名前に「SwingAppMain」を入力
- public static void main(String[] args)をチェック
3.作成したクラスのソースコードを以下のように変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | package swing.sample; // 必要なクラスのインポート import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class SwingAppMain implements ActionListener { private JFrame mainFrame; private Container contentPane; private JTextField textField; private JTextArea textArea; private JScrollPane scrollPane; private JPanel buttonPane; private JButton addButton; private JButton clearButton; // コンストラクタ public SwingAppMain() { mainFrame = new JFrame("サンプル"); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setSize(320, 200); mainFrame.setLocationRelativeTo(null); contentPane = mainFrame.getContentPane(); textField = new JTextField(); textArea = new JTextArea(); scrollPane = new JScrollPane(textArea); addButton = new JButton("追加"); clearButton = new JButton("消去"); // 「追加」ボタンとアクション・リスナーの関連付け addButton.addActionListener(this); // 「消去」ボタンとアクション・リスナーの関連付け clearButton.addActionListener(this); buttonPane = new JPanel(); buttonPane.add(addButton); buttonPane.add(clearButton); contentPane.add(textField, BorderLayout.NORTH); contentPane.add(scrollPane, BorderLayout.CENTER); contentPane.add(buttonPane, BorderLayout.SOUTH); mainFrame.setVisible(true); } // ユーザーの操作に応じた処理を実装 public void actionPerformed(ActionEvent event){ // ユーザーの操作対象を判断 if(event.getSource() == addButton) { // テキストエリアへ文字列を追加 textArea.append(textField.getText() + "\n"); } if(event.getSource() == clearButton) { // テキストエリアの文字列を全消去 textArea.setText(null); } } // アプリケーションの起動 public static void main(String[] args) { new SwingAppMain(); } } |
4.[実行]→[Javaアプリケーション]を選択して、実行する
実行した結果、テキスト入力用コンポーネント、追加・消去のボタンが配置されたウィンドウが開く。
ユーザーの操作([追加]ボタンのクリックというアクション)に応じてテキストフィールドに入力されている文字列をテキストエリアに追加する。
ユーザーの操作([消去]ボタンのクリックというアクション)に応じてテキストエリアの文字列をすべて消去する。
アクション・リスナーの実装
ボタンに対してユーザーの操作(アクション)に反応するためには「ActionListener」をimplementsしたクラスを定義する必要がある。
今回の例では「SwingAppMain」自身がその役割を担っている。
1 | public class SwingAppMain implements ActionListener { |
このインターフェイスは抽象メソッド「actionPerformed」を宣言しているため、「ActionListener」インターフェイスはimplementsするだけでは機能しない。
そのため「SwingAppMain」固有の「actionPerformed」メソッドを定義する。
1 2 | public void actionPerformed(ActionEvent event){ } |
アクション・リスナーの登録
1 2 3 4 | // 「追加」ボタンとアクション・リスナーの関連付け addButton.addActionListener(this); // 「消去」ボタンとアクション・リスナーの関連付け clearButton.addActionListener(this); |
ボタンはアクションがあった場合に、どのクラス(メソッド)を実行すればよいかをあらかじめ知っておく(関連付けておく)必要がある。
そのため「addActionListener」を記述し、ボタンとアクション・リスナーを実装したクラスとを関連付ける。
「addActionListener」の引数には「ActionListener」をimplementsしたクラスのインスタンスを設定する。
今回の例では「SwingAppMain」自身となるため「this」を設定している。
上記のコードを記述することで[追加]ボタンまたは[消去]ボタンがクリックされたとき「SwingAppMain」クラス固有の「actionPerformed」が実行されるようになる。
ユーザーの操作に応じた処理の実装
ボタンに対してアクションを行うと「ActionEvent」のインスタンスが生成される。
今回の例では、「追加」ボタンまたは「消去」ボタンに対して行われたアクション(クリック)の結果として生成された「ActionEvent」クラスのインスタンスの情報を基にアプリケーションの振る舞い(actionPerformed)を変えている。
1 2 3 4 5 6 7 8 9 10 11 12 | // ユーザーの操作に応じた処理を実装 public void actionPerformed(ActionEvent event){ // ユーザーの操作対象を判断 if(event.getSource() == addButton) { // テキストエリアへ文字列を追加 textArea.append(textField.getText() + "\n"); } if(event.getSource() == clearButton) { // テキストエリアの文字列を全消去 textArea.setText(null); } } |