0

我正在创建一个TableModelwhich extends AbstractTableModel。但是,它的内容会定期更改,并且列数会根据显示的数据而变化。有时,我需要使用 aComboBox来编辑第 2 列中的单元格,有时我需要使用 a ComboBoxfor 第 3 列中的单元格。

我知道您可以通过执行设置表格的默认渲染器table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(myComboBox));

我可以CellEditor在我的内部TableModel动态设置,以便CellEditor在我调用时更新table.updateUI()吗?

编辑:我基本上是在传递我正在使用TableModel的大WellCollection数据结构。冒着让你厌烦细节的风险,它由 组成Wells,由 组成Attributes,由 组成ProposedValues。不过,这不是很重要。重要的部分是我希望用户能够ProposedValues在单击下一步时翻阅属性并在表格中具有不同的显示(我之前使用 完成updateUI())。

请注意,anAttribute可以是高程类型,也可以不是高程类型。如果是高程类型,则需要在其中增加一列。

这是我的代码:

public class ProposedValueTableModel extends AbstractTableModel{
    private WellCollection wells;

    public ProposedValueTableModel(WellCollection wells){
        this.wells = wells;
    }


    @Override
    public int getColumnCount() {
        // if we're dealing with elevation values, we want fields for the value, the elevation type,
        // the source, and additional comments. If not, only show value, source, and comments.
        if(wells.getCurrAttribute().isElevationType())
            return 4;
        else return 3;
    }

    @Override
    public int getRowCount() {
        //NOTE: add 1 for extra, blank row! 
        return wells.getCurrAttribute().getProposedValues().size()+1;
    }

    @Override
    public Object getValueAt(int row, int col) {
        //TODO: convert this to handy dandy switch statements
        // make the last row blank to allow entries
        if (row==wells.getCurrAttribute().getProposedValues().size())
            return "";
        ProposedValue propVal = wells.getCurrAttribute().getProposedValues().get(row);
        //if we're NOT dealing with an elevation type, simply have three fields
        if(wells.getCurrAttribute().isElevationType()==false){
            switch(col){
            case 0:
                return propVal.val;
            case 1:
                return propVal.source;
            case 2:
                return propVal.comment;

            }
        }
        // if it IS an elevation value, include elevation type
        else{
            switch(col){
            case 0:
                    return propVal.val;
                case 1:
                    return propVal.elevType;
                case 2:
                    return propVal.source;
                case 3:
                    return propVal.comment;
            }
        }
        return "";
    }

    public String getColumnName(int col){

        if(wells.getCurrAttribute().isElevationType() ==false){
            switch(col){
                case 0:
                    return "Proposed value";
                case 1:
                    return "Source";
                case 2:
                    return "Comment";
            }
        }
        else{
            switch(col){
                case 0:
                    return "Proposed value";
                case 1:
                    return "Type";
                case 2:
                    return "Source";
                case 3:
                    return "Comment";
            }
        }
        return "header";
    }

    public boolean isCellEditable(int row, int col){
        return true;
    }

    public void setValueAt(Object value, int row, int col){
        // we're adding something to the last row, then add a new ProposedValue to the proposedValues array
        if(row == wells.getCurrAttribute().getProposedValues().size()){
            wells.getCurrAttribute().getProposedValues().add(new ProposedValue());
        }
        ProposedValue propVal = wells.getCurrAttribute().getProposedValues().get(row);
        if(wells.getCurrAttribute().isElevationType()==false){
            switch(col){
                case 0:
                    // Value
                    propVal.val = (String)value; break;
                case 1:
                    // Source
                    propVal.source = (String)value; break;
                case 2:
                    // Comment
                    propVal.comment = (String)value; break;
            }
        }
        else{
            switch(col){
                case 0:
                    // Value
                    propVal.val = (String)value; break;
                case 1:
                    // Elevation type
                    propVal.elevType = (String)value; break;
                case 2:
                    // Source
                    propVal.source = (String)value; break;
                case 3:
                    // Comment
                    propVal.comment = (String)value; break;
            }
        }
        //TODO: find out why this is necessary
        fireTableCellUpdated(row, col);
    }
}
4

2 回答 2

2

我可以在 TableModel 中动态设置 CellEditor,以便在调用 table.updateUI() 时更新 CellEditor?

  • 不,这不是更新 JTables 视图的正确方法

我正在创建一个扩展 AbstractTableModel 的 TableModel。但是,它的内容会定期更改,并且列数会根据显示的数据而变化。有时,我需要使用 ComboBox 来编辑第 2 列中的单元格,有时我需要使用 ComboBox 来编辑第 3 列中的单元格。

我可以在 TableModel 中动态设置 CellEditor

  • 注意 XxxTableModel 仅将 JComboBox 的字符串值存储为 XxxTableCellEditor

为了获得更好的帮助,请尽快发布SSCCE,简短,可运行,可编译,几乎带有JFrame硬编码值,用于存储为JTableJScrollPaneAbstractTableModellocal variable

于 2013-04-08T16:58:28.680 回答
2

我可以在 TableModel 中动态设置 CellEditor

CellEditor 不是由 TableModel 确定的。

JTable 确定使用哪个编辑器。

您可以覆盖 table.getCellEditor(...) 方法以动态更改正在使用的编辑器。有关此方法的示例,请参见:https ://stackoverflow.com/a/7770309/131872。

于 2013-04-08T17:04:11.203 回答