JTable のセルに編集用のドロップダウンを設定する方法
ここでは、次の画面のように JTable のセルの値の編集時に、ドロップダウンを表示する方法を説明します。
前の記事「JTable のセルの値を更新するテーブルモデルの実装方法」では、 テーブルモデルで isCellEditable で true を返して編集可能として、 さらに setValueAt でデータをテーブルモデルに取り込む、ということを説明しました。
セル編集時はセルエディターで
セルを編集するときには「テーブルセルエディター」と呼ばれるオブジェクトが使われます。
セルを表示するときには「テーブルセルレンダラー」でしたが、編集する時はエディターです。 登場するモノは多いですが、役割分担がしっかりしていて、わかりやすいですね。
テーブルセルレンダラーについては、「JTable でのデータの表示方法を決める セルレンダラー」をみてください。
さっそく、上の画面の最初のカラムのセルエディターとして、ドロップダウンを表示するセルエディターをセットしてみましょう。
プログラムの全体の構成は「JTable のセルの値を更新するテーブルモデルの実装方法」で使ったコードと同様です。
セルエディターの実装
セルエディターは TableCellEditor インターフェイスを実装したクラスです。
javax.swing パッケージには TableCellEditor インターフェイスをはじめとして 必要な機能を実装した便利なデフォルトセルエディター (DefaultCellEditor クラス) が用意されています。
DefaultCellEditor はコンストラクタで、チェックボックス (JCheckBox)、 テキストフィールド (JTextField)、コンボボックス (JComboBox) のいずれかを受け取ります。
次のコードではコンボボックスを渡して DefaultCellEditor を作成し、 TableColumn の setCellRenderer メソッドでセルエディターをセットしています。
package com.keicode.java.testapp;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;
@SuppressWarnings("serial")
public class TableTest17 extends JFrame {
public TableTest17() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(350, 150);
JTable table = new JTable();
MyTableModel3 tableModel = new MyTableModel3();
table.setModel(tableModel);
MyTableCellRenderer tableCellRenderer = new MyTableCellRenderer();
TableColumn col = table.getColumnModel().getColumn(0);
col.setCellRenderer(tableCellRenderer);
// 最初のカラムにのセルエディターにドロップダウンを使用
JComboBox<String> combo = new JComboBox<String>();
combo.addItem("X");
combo.addItem("Y");
combo.addItem("Z");
col.setCellEditor(new DefaultCellEditor(combo));
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableTest17 app = new TableTest17();
app.setVisible(true);
}
});
}
}
これによって、上記でみたようにセルの編集時にドロップダウン(コンボボックス)が表示されるはずです。
ここではインラインで記述しましたが、セルエディターを再利用するには、デフォルトセルエディターのサブクラスを明示的に作成することも可能です。
package com.keicode.java.testapp;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
@SuppressWarnings("serial")
public class MyCellEditor extends DefaultCellEditor {
static JComboBox<String> combo = new JComboBox<String>();
public MyCellEditor() {
super(combo);
combo.addItem("X");
combo.addItem("Y");
combo.addItem("Z");
}
}
これでセルエディターをセットする箇所はシンプルになります。
col.setCellEditor(new MyCellEditor());
以上でセルの編集時にコンボボックスを使う方法を説明しました。