【问题标题】:JTable cells getting overlappedJTable 单元格重叠
【发布时间】:2016-07-11 14:37:21
【问题描述】:

我已经实现了一个 JTree 并填充了一些数据。该表包含三列,并且基于特定单元格上的某些值,它应该具有标签或组合框。第三列中的所有值都是可编辑的。我也有一个 JTree,从中选择一个节点,并根据它相应地更改表值。当我编辑表格中的一个单元格并移动到树中的另一个节点(填充表格中的一组新数据)时,问题存在,先前编辑的单元格值存在于新单元格值顶部的表格中。下面是我如何实现 TableCellRenderer 和 TableCellEditor。因为我是挥杆初学者,所以我可能用错了一些概念。请帮我弄清楚我做错了什么。

        public void populateTableData(List<Field> list,JTree jTree){
        fieldList = null;
        tcBuilderTree = jTree;
        fieldList = list;
        md=new PropertiesTableModel(fieldList);
        getPropertieseTable().setModel(md);

        final TableCellRenderer cellRenderer = new TableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable arg0, 
                                                            Object value, 
                                                            boolean isSelected, 
                                                            boolean hasFocus, 
                                                            int row, 
                                                            int col) {

                if(value instanceof List<?>) {
                    List<Value> valueList=(ArrayList)value;
                    return createComboBox(valueList);
                }
                else{
                    JLabel lbl=new JLabel();
                    lbl.setText((String)value);
                    return lbl;
                }

            }
        };
        propertiesTable.setDefaultRenderer(Object.class, cellRenderer);

        final TableCellEditor cellEditor = new TableCellEditor() {
            private DefaultCellEditor textEditor;
            private DefaultCellEditor currentEditor;
            @Override
            public Component getTableCellEditorComponent(JTable table,
                                                        Object value, 
                                                        boolean isSelected, 
                                                        int row, 
                                                        int column) {
                textEditor = new DefaultCellEditor(new JTextField());
                PropertiesTableModel model = (PropertiesTableModel) table.getModel();
                List<Value> values = model.getPossibleValues(row, column);
                if (values != null) {
                    List<Value> valueList=(ArrayList)value;
                    currentEditor = new DefaultCellEditor(createComboBox(valueList));
                } else {
                    currentEditor = textEditor;
                }
                return currentEditor.getTableCellEditorComponent(table, value,
                        isSelected, row, column);
            }

            @Override
            public Object getCellEditorValue() {
                return currentEditor.getCellEditorValue();
            }

            @Override
            public boolean isCellEditable(EventObject anEvent) {
                JTable tbl = (JTable) anEvent.getSource();
                int row, col;
                if (anEvent instanceof MouseEvent) {
                    MouseEvent evt = (MouseEvent) anEvent;
                    row = tbl.rowAtPoint(evt.getPoint());
                    col = tbl.columnAtPoint(evt.getPoint());
                } else {
                    row = tbl.getSelectedRow();
                    col = tbl.getSelectedColumn();
                }
                if(col<2){
                    return false;
                }
                else
                {
                    return true;
                }
            }

            @Override
            public boolean shouldSelectCell(EventObject anEvent) {
                return true;
            }

            @Override
            public boolean stopCellEditing() {
                Object obj = currentEditor.getCellEditorValue();
                fieldList.get(propertiesTable.getEditingRow())
                                                .setDefaultValue(obj);
                return currentEditor.stopCellEditing();
            }

            @Override
            public void  cancelCellEditing() {
                currentEditor.cancelCellEditing();
            }

            @Override
            public void addCellEditorListener(CellEditorListener l) {
            }

            @Override
            public void removeCellEditorListener(CellEditorListener l) {

            }
        };
        propertiesTable.setDefaultEditor(Object.class,cellEditor);
    }

【问题讨论】:

    标签: java swing jtable tablecellrenderer tablecelleditor


    【解决方案1】:

    当我编辑表格中的一个单元格并移动到树中的另一个节点(在表格中填充一组新数据)时存在问题,之前编辑的单元格值存在于新单元格顶部的表格中价值观。

    我猜你在用新数据重新加载表格之前不会停止编辑表格单元格。

    您可能应该在创建 JTable 时将以下内容添加到您的代码中:

    JTable table = new JTable(...);
    table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    

    更多信息请参见Table Stop Editing

    表格包含三列,根据特定单元格上的一些值,它应该有标签或组合框

    您可能不需要创建自定义编辑器。只需让表格根据正在编辑的单元格选择适当的默认编辑器即可。您可以通过覆盖 JTable 的 getCellEditor(...) 方法来完成此操作。查看:How to add unique JComboBoxes to a column in a JTable (Java) 获取此方法的示例。

    【讨论】:

    • 停止单元格编辑并没有解决问题。我也添加了一张关于它的外观的图片。显然已编辑的单元格会创建一个可编辑的控件,但它不会消失。
    • @Sherihan 当您摆脱自定义编辑器和渲染器后会发生什么?
    • 我没有尝试使用默认编辑器选项。我觉得每次我更新一个单元格时,都会创建一个新的 JTextField 并且它是问题所在。有没有办法解决这个问题?
    • I didn't try using the default editor option - 为什么不呢?如果没有必要,你为什么要重新发明轮子? I feel that every time I update a cell, a new JTextField gets created 编辑单元格时,会显示一个编辑器以覆盖单元格的整个区域。所以即使你正在创建一个新的编辑器,它仍然会覆盖以前的编辑器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2023-03-26
    相关资源
    最近更新 更多