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

时间:2011-10-07 17:16:13

标签: java swing jtable rowfilter

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

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

我想将最初的单元格渲染为JCheckBox,并且最初为false的所有单元格都不显示任何内容(没有JCheckBox)。用户可以检查或取消检查最初为真的单元格中的JCheckBox,这对我创建的图表有用。

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

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,但它无效。我正在考虑使用多个单元格渲染器来完成此任务。有可能这样做吗?任何建议将不胜感激!

2 个答案:

答案 0 :(得分:5)

将Boolean.TRUE存储为真值。然后为false值存储一个空String。然后你需要:

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);
    }

};

使用此方法无需自定义渲染器或编辑器。

答案 1 :(得分:3)

如果初始值为false,则getTableCellRendererComponent返回空白JLabel。