带有自定义DefaultListCellRenderer的JCombobox作为DefaultCellEditor:返回字符串值而不是自定义对象

时间:2015-10-10 09:31:41

标签: java swing combobox jtable listcellrenderer

我有一个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?

1 个答案:

答案 0 :(得分:0)

为什么你必须使用如此多的自定义逻辑来渲染和选择组合框中的Section对象?

如果我理解正确,你试图只在JCombobox上渲染你的Section对象的名称,但是能够在JTable中检索整个Section对象。

要实现这一目标,您只需要做一些事情:

  1. 使用可供选择的Section对象向量初始化JComboBox。

  2. 在其toString方法中返回Section的名称,因为JComboBox会评估其项目的toString以进行渲染。

  3. 设置要在CellEditor中用于Section的JTable列的combox(已完成)

  4. 一个正在运行的例子是:

    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);
                }
            }
        });
    }
    }