JTableのセルのエディターにコンボボックスを使う 2008/01/25

各セルのコンボボックスの選択リストが変化する場合に工夫が必要となります。

まず、専用のエディターを作成(TableCellEditorを実装)します。そのときに、エディターの雛形としてコンボボックスを使います。実装としては、javax.swing.AbstractCellEditorを継承して、javax.swing.table.TableCellEditorをインプリメントして実装したほうが無難かなと思いました。まちがいも少ないと思います。

おそらく仕組みとしては、getTableCellEditorComponentがテーブルからよばれて、ユーザーが操作するエディターが表示されます。ユーザーの操作が終わるとTableは、getCellEditorValueを呼んで、テーブルモデルに適用する値を取得します。

package swing;

import java.awt.Component;
import java.awt.GridBagLayout;

import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

import java.awt.GridBagConstraints;

public class TestTable extends JPanel {

private static final long serialVersionUID = 1L;
private JScrollPane jScrollPane = null;
private JTable jTable = null;

public TestTable() {
super();
initialize();
}

private void initialize() {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.gridx = 0;
this.setSize(300, 200);
this.setLayout(new GridBagLayout());
this.add(getJScrollPane(), gridBagConstraints);
}

private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(getJTable());
}
return jScrollPane;
}

private JTable getJTable() {
if (jTable == null) {
jTable = new JTable();
DefaultTableModel tableModel = new DefaultTableModel(5, 2);
tableModel.setColumnIdentifiers(new String[] { "A", "B" });

/*
* コンボボックス用のエディター
*/
class MyEditor extends AbstractCellEditor implements
TableCellEditor {

JComboBox comboBox = new JComboBox();

public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {

comboBox.removeAllItems();
for (int i = 0; i < 5; i++) {
comboBox.addItem(String.format("item(row:%d) %d", row, i));
}

return comboBox;
}

/*
* コンボボックスの選択された値を返します。
* @see javax.swing.CellEditor#getCellEditorValue()
*/
public Object getCellEditorValue() {
return comboBox.getSelectedItem();
}

}

jTable.setModel(tableModel);
jTable.getColumn("A").setCellEditor(new MyEditor());

}
return jTable;
}

}

: