Swing復習 その(6) JTableを使う

By | 2011年7月22日

Swingでエクセルのような表を表示したいときは、JTableを使う。
最もシンプルにJTableを使う方法は、以下の様な感じになる。

public class JTableLesson extends JFrame {

	public JTableLesson(String title){
		super(title);

		final String[] columnNames = {
				"Day",
				"Content",
				"Price"
		};

		final Object [][] data ={
				{"2011/07/20","みかん","300円"},
				{"2011/07/20","りんご","450円"},
				{"2011/07/21","バナナ","120円"},
				{"2011/07/21","メロン","650円"}
		};

		// 配列で定義した固定データをコンストラクタの引数として渡す
		final JTable table = new JTable(data,columnNames);

		// スクロールペインの上にJTableを乗せる。
		// これをしないと、画面が小さくなったときにスクロールバーが表示されない。
		final JScrollPane scrollPane = new JScrollPane(table);
		add(scrollPane);
	}


	public static void main(String[] args){
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				final JFrame jf = new JTableLesson("JTableLesson");
				jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				jf.setSize(300, 200);
				jf.setVisible(true);
			}
		});
	}
}

実行すると、以下のように表示される。

この方法だと行数は常に固定である。実際には、行の数はアプリの実行中に増減することが多いだろう。
柔軟性を考えると、DefaultTableModelを使った方が良さそうである。

DefaultTableModelを使ったサンプルを以下に示す。

public class JTableLesson extends JFrame {

	public JTableLesson(String title){
		super(title);

		final DefaultTableModel model = 
			new DefaultTableModel(new String[]{"Num","Date","Price"},0);

		// DefaultTableModelをコンストラクタの引数として渡す
		final JTable table = new JTable(model);

		// 追加ボタン
		final JButton btnAdd = new JButton("Add");
		btnAdd.addActionListener(new ActionListener() {

			final SimpleDateFormat sdf = 
				new SimpleDateFormat("yyyy-MM-dd-ss");
			final Random rnd = new Random();

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 適当なデータを作って追加する
				model.addRow(new String[]{
						String.valueOf(model.getRowCount()),
						sdf.format(new Date()),
						String.valueOf(rnd.nextInt(10000))});
			}
		});


		JScrollPane scrollPane = new JScrollPane(table);

		getContentPane().add(scrollPane, BorderLayout.CENTER);
		getContentPane().add(btnAdd, BorderLayout.PAGE_END);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				JFrame jf = new JTableLesson("JTableLesson");
				jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				jf.setSize(300, 200);
				jf.setVisible(true);
			}
		});
	}
}

実行すると以下のようになる。
Addボタンを押すと、適当なデータが次々と表に追加されていく。

このサンプルでも、まだ実用には程遠いがDefaultTableModelの使い方のイメージはつかめるだろう。
DefaultTableModelはAbstractTableModelのデフォルトの実装である。よりカスタマイズをしたければ、AbstractTableModelを自分で実装していくことになるだろう。JTableは奥が深い。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です