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は奥が深い。