【问题标题】:JTable Reverts JComboBox and JCheckBox to Values after SelectionJTable 在选择后将 JComboBox 和 JCheckBox 恢复为值
【发布时间】:2019-04-07 04:47:09
【问题描述】:

我有一个带有JComboBox<Integer>s 列和JCheckBoxs 列的JTable。 JTable 使用适当的渲染器和编辑器进行设置。该表起初看起来不错,但在从组合框或复选框中选择一个值后,单元格似乎恢复为整数和布尔值。这个问题似乎不仅仅是装饰性的,因为预期单元格具有组合框或复选框的方法在查找整数或布尔值时会抛出错误。

这是它的外观图片:

这里是代码:

    dataTable.removeAll();
    numberOfVariables = 7;
    Object[] header = new Object[numberOfVariables];
    header[0] = new String("Ring Number");
    header[1] = new String("Radius (cm)");
    header[2] = new String("Plume Distribution");
    header[3] = new String("Thickness (A)");
    header[4] = new String("Deposition Time (s)");
    header[5] = new String("Rate (A/s)");
    header[6] = new String("Optimize (y/n)");

    Object[][] data = new Object[numberOfRings][numberOfVariables];
    for(int k=0;k<numberOfRings;++k){
        Object[] row = new Object[numberOfVariables];
        row[0] = Integer.toString(k+1);
        row[1] = String.format("%.2f", plume.getRingRadius(k));
        row[2] = createDistributionComboBoxForRing(k);
        row[3] = String.format("%.2f", plume.getThicknessOfRing(k));
        row[4] = String.format("%.2f", plume.getTimeForRing(k));
        row[5] = String.format("%.2f", plume.getRateForRing(k));
        row[6] = new JCheckBox();
        ((JCheckBox) row[6]).setSelected(true);
        data[k] = row;
    }
    tableModel = new DefaultTableModel(data,header);
    dataTable.setModel(tableModel);
    dataTable.getColumnModel().getColumn(2).setCellRenderer(new ControlTableRenderer());
    //dataTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor( createDistributionComboBoxForRing(0) ));
    dataTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor( (JComboBox<Integer>) data[0][2] ));
    dataTable.getColumnModel().getColumn(6).setCellRenderer(new ControlTableRenderer());
    dataTable.getColumnModel().getColumn(6).setCellEditor(new DefaultCellEditor( (JCheckBox) data[0][6] ));
    dataTable.updateUI();

【问题讨论】:

    标签: java swing user-interface jtable jcombobox


    【解决方案1】:
    row[2] = createDistributionComboBoxForRing(k);
    row[3] = String.format("%.2f", plume.getThicknessOfRing(k));
    row[4] = String.format("%.2f", plume.getTimeForRing(k));
    row[5] = String.format("%.2f", plume.getRateForRing(k));
    row[6] = new JCheckBox();
    ((JCheckBox) row[6]).setSelected(true);
    

    JTable 的 TableModel 存储数据,而不是组件。

    因此,如果第 3 列包含 Integer 对象,则您将 Integer 存储在 TableModel 中,并将该列的编辑器设置为包含有效整数列表的组合框。

    包含复选框渲染器/编辑器的列也是如此。在这种情况下,您存储一个 Boolean 对象。

    例如:

    row[2] = new Integer(1);
    row[6] = Boolean.TRUE
    

    现在在 TableModel 中,您需要告诉表格每列中的数据类型,因此您需要覆盖 getColumnClass(...) 方法。比如:

    tableModel = new DefaultTableModel(data,header)
    {
        @Override
        public Class getColumnClass(int column)
        {
            switch (column)
            {
                case 2: return Integer.class;
                case 6: return Boolean.class;
                default: return Object.class;
            }
        }
    };
    

    现在表格可以为每一列选择合适的渲染器和编辑器。

    但是,对于组合框,您必须使用组合框的值创建自定义编辑器。有关如何执行此操作的工作示例,请参阅 Using a Combo Box as an Editor 上的 Swing 教程部分。

    另外,您错误地使用了其他一些方法:

    dataTable.removeAll();
    

    不知道那是为了什么。这是从面板中移除组件的 Container 方法。您只需要setModel(...) 语句来重置表。

    dataTable.updateUI();
    

    不需要使用 updateUI() 方法。当 LAF 更改时,该方法在内部使用。你并没有改变 LAF,所以去掉那个声明。

    【讨论】:

      【解决方案2】:

      单元格渲染器和编辑器的想法是,您只有一个组件,并且可以四处移动,并且每一行的数据都会更改。该代码为每个单元格使用不同的JComponent 实例。只需将数据放入表格模型中,让单元格渲染器和编辑器管理组件即可。

      【讨论】:

      • 您能详细说明一下吗?我不明白你的建议。你是说我不必使用特定于组件的渲染器和编辑器吗?我读过的所有内容,“如何将 JComboBox 和 JCheckBox 插入 JTable”都说我必须使用渲染器和编辑器。更不用说,我最初尝试不使用它们,但没有奏效。
      • @user2303321 否*。我是说表模型数据应该只是没有任何渲染器、编辑器和相关组件的数据。 TableColumnTableColumnModel 中管理为任何单元格提供正确的渲染器和编辑器,这些单元格可能源自列的Class 集。 (*为 Object(显然)、NumberBoolean 类安装了默认渲染器和编辑器,但这些可能不是您想要的。)
      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      相关资源
      最近更新 更多