我有一个JTable
,其中包含一个实现AbstractTableModel
的模型。该模型包含自定义RequisitionItem
个对象,这些对象在其中一个字段中也有一个Section
对象。在表中插入新记录时,我添加一个新行,其中新的RequisitionItem
初始化为非空但值为空。对于Section
列,我有表格和组合框的自定义渲染器,如下所示
表;
requestItemsTable.getColumnModel().getColumn(3).setCellRenderer(new DefaultTableCellRenderer(){
public void setValue(Object value) {
if (value==null) {
setText("");
} else {
Section section = (Section) value;
setText(section.getName());
}
}});
用于组合框;
sectionComboBox.setRenderer(new 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) {
setText(((Section) value).getName());
}
if (index == -1) {
setText("");
}
return this;
}
});
进行编辑,我有以下内容;
sectionComboBox = new JComboBox<>();
sectionComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(sectionJpaController.getDepartmentSections(department.getNumber()).toArray(new Section[0])));
requestItemsTable.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(sectionComboBox));
但是点击Section
单元格后,选择组合框中的Section
项之一并按Enter键,我得到java.lang.ClassCastException: java.lang.String cannot be cast to ***.model.domain.Section
。播种为什么从DefaultCellEditor
返回而不是一个section对象而是String?
答案 0 :(得分:0)
为什么你必须使用如此多的自定义逻辑来渲染和选择组合框中的Section对象?
如果我理解正确,你试图只在JCombobox上渲染你的Section对象的名称,但是能够在JTable中检索整个Section对象。
要实现这一目标,您只需要做一些事情:
使用可供选择的Section对象向量初始化JComboBox。
在其toString方法中返回Section的名称,因为JComboBox会评估其项目的toString以进行渲染。
设置要在CellEditor中用于Section的JTable列的combox(已完成)
一个正在运行的例子是:
public class JTableWithComboboxEditor extends JFrame {
class Section {
String name;
int value2;
public Section(String name, int value2) {
this.name = name;
this.value2 = value2;
}
@Override
public String toString() {
return name;
}
}
private JTable table = new JTable(new DefaultTableModel(new String[]{"Section"}, 2));
public JTableWithComboboxEditor() {
this.add(new JScrollPane(table));
Section section1 = new Section("A", 1);
Section section2 = new Section("B", 2);
Vector sectionList = new Vector();
sectionList.add(section1);
sectionList.add(section2);
JComboBox comboBox = new JComboBox(sectionList);
table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(comboBox));
table.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
Object value = table.getValueAt(0, 0);
if (value != null) {
Section section = (Section) value;
System.out.println(section.name + " " + section.value2);
}
}
});
}
}