【问题标题】:JTable cell editor changing typesJTable 单元格编辑器更改类型
【发布时间】:2014-01-01 15:44:39
【问题描述】:

我有一个应该是 2 列的 JTable(字符串、JComboBox)。当我初始化表格时,一切看起来都很好。一旦我在表格中选择了一个值,JComboBox 单元格就会获取所选项目的数据类型。

我想将 JCOmboBox 保留在那里并让它触发数据更改事件,并且表格忽略该列中的数据更改并保持 ComboBox 填充。

我的桌子有这个作为替代

@Override
public TableCellEditor getCellEditor(int row, int column) {
    Object value = super.getValueAt(row, column);
    if (value != null) {
        if (value instanceof JComboBox) {
            return new DefaultCellEditor((JComboBox) value);
        }
        return getDefaultEditor(value.getClass());
    }
    return super.getCellEditor(row, column);
}

实施

    JComboBox uploadBox = new JComboBox();
    uploadBox.addItem(MyPanel.UPLOAD_OPTIONS.PROMPT);
    uploadBox.addItem(MyPanel.UPLOAD_OPTIONS.UPLOAD);
    uploadBox.addItem(MyPanel.UPLOAD_OPTIONS.DONT_UPLOAD);

    Object[][] tableData = new Object[][]{
        {"Upload data on save", uploadBox}
    };



    table.setModel(
            new DefaultTableModel(tableData, new String[]{"Description", "Options"}) {
        Class[] types = new Class[]{String.class, JComboBox.class};
        boolean[] canEdit = new boolean[]{false, true};

        @Override
        public Class getColumnClass(int columnIndex) {
            return types[columnIndex];
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit[columnIndex];
        }


    });

    table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRenderer() {

        @Override
        public Component getTableCellRendererComponent(JTable jtable, Object o, boolean bln, boolean bln1, int i, int i1) {
            return (Component)o;
        }
    });

【问题讨论】:

    标签: java swing jtable jcombobox tablecelleditor


    【解决方案1】:
    • 答案很简单,不要将JComboBox 放入XxxTableModel 或将getColumClass 设置为JComboBox.class,这是错误的(当然可以,但有很多副作用),@987654327 @(指定为)只能直接保存标准Java数据类型(StringDateIcon/ImageIconIntegerDouble等...)

    • XxxTableModel 应该存储(如果您不想在 Java 数据类型之间解析)与存储在 DefaultComboBoxModel 中的相同数据类型(注意清楚什么是 MyPanel.XXX),例如在XxxTableModel 中存储String 值,当DefaultComboBoxModel 具有相同的数据类型时,DateIcon/ImageIconIntegerDouble 的逻辑类似

    • 更多信息请阅读Oracle教程How to use Tables - Using a Combo Box as an Editor

    【讨论】:

    • @meriley 我这里有几篇带有 SSCCE 形式代码的帖子,标记为 java + swing + jtable + jcombobox
    • 我的问题是每一行都有不同的 JComboBox(它们存储不同的数据),而提供的示例是所有行的统一数据集。
    • @meriley 每一行都有一个不同的 JComboBox - 这不是任何问题,有三种方法可以为分离的 DefaultComboBoxModel 保存不同的值(不需要总是创建定义),但它们中的任何一个即将将JComboBox放入模型,为列和行坐标指定渲染器,或者存储在Map中,或者存储在Vector,
    • @meriley 您需要接受该模型被指定为仅保存 JComboBox 作为单元格编辑器的初始(或最后选择的)值(由 TableCellRenderer 在 JTables 视图中绘制),TableCellEditor 是关于临时 JComponents,即将值存储到模型,然后渲染器即将将值从模型绘制到 JTable
    • +1 用于区分模型; @meriley:TableComboBoxByRow 可能感兴趣。
    猜你喜欢
    • 2011-09-27
    • 2015-03-24
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多