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

投稿者: | 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は奥が深い。

コメントを残す

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