当前位置: 首页 > 面试题库 >

JTable中的一列有多个单元格渲染器?

郝原
2023-03-14
问题内容

假设我有以下JTable,只要按下一个按钮,就会显示该JTable:

      | Name
------+------------
True  | Hello World
False | Foo Bar
True  | Foo
False | Bar

我想呈现 最初 对JCheckBox 为真的单元格,以及所有 最初为
false的所有单元格不显示任何内容(无JCheckBox)。用户可以选中或取消选中最初为真的单元格中的JCheckBoxes,这会对我创建的图表有所帮助。

现在,我的单元格渲染器在所有单元格中显示JCheckBoxes,包括最初为false的单元格(它显示那些没有复选标记的JCheckBoxes),但我不想在后者中显示任何内容。这是我的代码

protected class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer {

  public Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
    if (!(Boolean) tableModel.getValueAt(row, 0)) {
      NoCheckBoxCellRenderer renderer = new NoCheckBoxCellRenderer();
      return renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
    this.setSelected((Boolean) tableModel.getValueAt(row, 0));
    return this;
  }

}

protected class NoCheckBoxCellRenderer extends DefaultTableCellRenderer {

  public Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
    this.setVisible(false);
    return this;
  }
}

在该if语句中,我尝试在使用this.setVisible(false)之前先使用NoCheckBoxCellRenderer,但是它没有用。我正在考虑使用多个单元格渲染器来完成此任务。有可能这样做吗?任何建议将不胜感激!


问题答案:

将Boolean.TRUE存储为真实值。然后为错误的值存储一个空字符串。然后,您需要:

a)重写getCellRenderer(…)方法以为单元格中找到的数据返回适当的渲染器。

b)使包含空字符串的单元格不可编辑:

JTable table = new JTable(data, columnNames)
{
    public TableCellRenderer getCellRenderer(int row, int column)
    {
        if (column == 0)
        {
            Class cellClass = getValueAt(row, column).getClass();
            return getDefaultRenderer( cellClass );
        }

        return super.getCellRenderer(row, column);
    }

    public boolean isCellEditable(int row, int column)
    {
        Class cellClass = getValueAt(row, column).getClass();

        if (column == 0 && cellClass instanceof Boolean)
        {
            return true;
        }
        else
        {
            return false;
        }

        return super.isCellEditable(row, column);
    }

};

使用这种方法,不需要自定义渲染器或编辑器。



 类似资料:
  • 问题内容: 我正在跟踪发现的一些代码,(是的,我知道它是如何工作的)它来自这里:代码链接 我想做的是如果单元格值设置为“黄色”,则设置单元格前景色 这是我的代码: 和单元格渲染器 问题是,如果我将任何单元格值设置为“黄色”,它就不会改变 提前致谢! 问题答案: 您的渲染器曾经使用过吗?您将其设置为包含String的单元格的默认渲染器,但是是否重载了模型的方法,以便它知道某些单元格包含String

  • 问题内容: 你们真是太棒了,为我在最后一个问题上指明了正确的方向,我在这里对我原来的问题进行了扩展: 如何将JTable列设置为String并排序为Double? 由于现在我使用自定义单元格渲染器将价格列的格式设置为$ ###,## 0.00,因此我现在还为该单元格设置了JTextField编辑器。单元格的编辑工作正常,除了更新值时,自定义渲染器中设置的数字格式似乎不再格式化单元格(在提交编辑后,

  • 单元格渲染器: 将JChecboxs添加到面板: [在此输入图片描述][1] 强文本[1]:https://i.stack.imgur.com/D8Mhs.png 请查找所附图像。

  • 我创建了一个带有自定义表格呈现和自定义单元格编辑器的JTable,它在图像中给出结果 我使用一个扩展JPanel的单独类创建了第一个表格单元格中显示的面板。并将表值添加为, 这是我的表格自定义类来创建这个表格, 我的问题是认为面板如我预期的那样显示,我不能在文本字段中键入或更改复选框或单击按钮。请告诉我如何解决这个问题。

  • 我创建了自定义单元渲染器,该渲染器从方法getTableCellRendererComponent中获取参数,并基于值列表创建复选框,值列表是整数的列表。 问题是,当拖动窗口或调整其大小时,会多次调用渲染器,并且面板会在JTable的单元格中多次添加,从而导致重复的JCheckBox。 渲染器: 单元格编辑器: 主面板: (

  • 我试图使我的头的背景具有渐变。 这可以很好地使用代码: 然而,由于某种原因,我看不到我的边框和文本,似乎文本也应用了渐变? 我希望文本为黑色,各栏之间有彩色边框。有什么想法吗?