JListを使いSwingの仕組みを理解する:SwingでJavaに強くなる(5)(2/2 ページ)
前回まではSwingアプリケーションの基本的な仕組みを説明してきました。今回からは、実際に簡単なGUIアプリケーションを作成することを通じて、Swingの仕組みをさらに掘り下げていきます。
ToDoリストの実装
前ページで説明したJListを使用して、ToDoリストを実装してみましょう。
プロジェクトの作成
今回は「ToDoList」という名前のプロジェクトを作成します。プロジェクトの作成は、第1回の「プロジェクトの作成」を参考にして行ってください。
SwingAppMainクラスの作成
次に、アプリケーションの起動および土台となるフレームの生成を担当するクラス「SwingAppMain」を以下のように作成します。
package swing.sample; import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.SwingUtilities ;public class SwingAppMain { /** * アプリケーションの起動 */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowTodoList(); } }); } /** * ToDoリストの生成と表示を行います。 */ private static void createAndShowTodoList() { JFrame mainFrame = new JFrame("ToDoリスト"); mainFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); Container contentPane = mainFrame.getContentPane(); // ToDoリストを生成 JComponent newContentPane = new ToDoListPane(); contentPane.add(newContentPane, BorderLayout.CENTER); // Windowサイズを調整 mainFrame.pack(); // 表示 mainFrame.setVisible(true); } }
ToDoListPaneクラスの生成
次に、ToDoListPaneクラスを作成します。このクラスは、ToDoリストのすべての機能を提供するクラスです。
package swing.sample; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; /** * ToDoリスト */ public class ToDoListPane extends JPanel { private JList toDoList; private DefaultListModel toDoListModel; private JTextField toDoInputField; private JButton addButton; private JButton modifyButton; private JButton removeButton; public ToDoListPane() { super(new BorderLayout()); // 一覧を生成 toDoListModel = new DefaultListModel(); toDoList = new JList(toDoListModel); JScrollPane listScrollPane = new JScrollPane(toDoList); // ToDo追加用テキストフィールドの生成 toDoInputField = new JTextField(); // 各ボタンの生成 JPanel buttonPanel = new JPanel(); addButton = new JButton("追加"); modifyButton = new JButton("編集"); removeButton = new JButton("削除"); // ボタンにリスナを設定 addButton.addActionListener(new AddActionHandler()); buttonPanel.add(addButton); buttonPanel.add(modifyButton); buttonPanel.add(removeButton); add(listScrollPane, BorderLayout.NORTH); add(toDoInputField, BorderLayout.CENTER); add(buttonPanel, BorderLayout.SOUTH); } /** * 追加ボタンアクションのハンドラ */ private class AddActionHandler implements ActionListener { public void actionPerformed(ActionEvent e) { // テキストフィールドの内容を リストモデルに追加 toDoListModel.addElement (toDoInputField.getText()); } } }
以上でコーディングは終了しました。実行してみましょう。
アプリケーションの実行
「SwingAppMain」クラスを実行すると、図3のウィンドウが表示されます。
今回は、以下の機能を実装しました。
- ToDoを一覧表示する。
- [追加]ボタンをクリックすると、テキストフィールドに入力されている文字列(ToDo)を一覧に追加する。
プログラムの解説
SwingAppMainとToDoListPaneの2つのクラスを作成しましたが、それぞれの役割について説明していきましょう。
ToDoリストが提供する機能はToDoListPaneクラスが担当し、アプリケーションの起動等の機能はSwingAppMainクラスが担当するという構成になっています。 今回はToDoListPaneクラスについてのみ解説します。SwingAppMainクラスには、いままでに解説していないコードが記述されていますが、説明の都合上次回に解説します。
JListの生成
ToDoリストは追加/編集/削除機能を持つため、ListModel も状態の変更を受けて更新する処理が必要です。
ここでは、これらの機能を満たしているDefaultListModelを生成しています(ここでは標準ライブラリに用意されている実装を利用していますが、ListModelを実装することで、自由に実装することが可能です)。
// 一覧を生成 toDoListModel = new DefaultListModel(); toDoList = new JList(toDoListModel); JScrollPane listScrollPane = new JScrollPane(toDoList);
2行目、3行目でDefaultListModelを使用してJListを生成し、JListにスクロール機能を与えています。最後にaddメソッドによりToDoListPaneに追加し、ToDo一覧の作成が完了します。
add(listScrollPane, BorderLayout.NORTH);
ToDo追加機能の実装
AddActionHandlerクラスは、[追加]ボタンのイベントに対する処理を担当するインナークラスです。
「toDoListModel.addElement();」にて、toDoListModelへパラメータで指定したデータを追加することができます。追加されたデータの情報は、ListModelの監視の仕組みにより、JListのビューへ反映されます。
/** * 追加ボタンアクションのハンドラ */ private class AddActionHandler implements ActionListener { public void actionPerformed(ActionEvent e) { // テキストフィールドの内容を // リストモデルに追加 toDoListModel.addElement (toDoInputField.getText()); } }
今回は、ToDoリストで使用するJListを中心に解説しました。また、ToDoリストの機能のうち「ToDoを一覧にて表示する」機能と「テキストフィールドに入力された内容を一覧に追加することを可能とする」機能を実装しました。次回はToDoリストに必要な残りの2つの機能を実装します。
Copyright © ITmedia, Inc. All Rights Reserved.