有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JTable中一列的java多单元格呈现器?

假设我有以下JTable,按下按钮后立即显示:

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

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

现在,我的单元渲染器在所有单元中显示jcheckbox,包括那些最初为false的单元(它显示那些没有复选标记的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语句中,我尝试在使用NoCheckBoxCellRenderer之前使用this.setVisible(false),但它不起作用。我正在考虑使用多个单元格渲染器来完成此任务。有可能这样做吗?任何建议都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    如果初始值为false,则让getTableCellRendererComponent返回一个空白JLabel

  2. # 2 楼答案

    存储布尔值。对于真值,为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);
        }
    
    };
    

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