jComboBox 列を持つ jTable があります。ただし、最初にクリックしないと jComboBox を表示できないという問題がありました。他の人も同じ問題を抱えているようです。
そこで、CellEditor 以外に CellRenderer を作成する必要があることを知りました。そして、私はそうしました...
public class MyCellRenderer extends JComboBox<CustomItem> implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
if(isSelected){
setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
} else{
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setSelectedItem(value);
return this;
}
}
ちなみに、アイテムを含むときにテキストを表示する必要があるため、ComboBoxRenderer も使用しています。
public class MyComboBoxRenderer extends BasicComboBoxRenderer{
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(value != null){
CustomItem customItem = (CustomItem) value;
setText(customItem.getText());
}
if(index == -1){
CustomItem customItem = (CustomItem) value;
setText("" + customItem.getText());
}
return this;
}
}
そして今、それは機能します!デフォルトでは jTable に jComboBox が表示されますが、各行の各 jComboBox には永続的なフォーカスがあります。最初にクリックしたものだけが実際にメニューを表示します。残りは「選択」されますが、応答しません。
編集:テーブルを作成する方法は次のとおりです。
private void initializeTable(){
JTable jTable1 = new javax.swing.JTable();
DefaultTableModel dtm = new DefaultTableModel();
dtm.addColumn("one");
dtm.addColumn("two");
dtm.addColumn("three");
jTable1.setModel(dtm);
JComboBox<CustomItem> items = new JComboBox<>();
items.setRenderer(new MyComboBoxRenderer());
items.add(new CustomItem(1, "soup", false);
items.add(new CustomItem(33, "sauce", false);
items.setSelectedIndex(0);
jTable1.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(items));
jTable1.getColumnModel().getColumn(2).setCellRenderer(new MyCellRenderer());
}