Несколько визуализаторов ячеек для столбца в JTable? - PullRequest
3 голосов
/ 07 октября 2011

Допустим, у меня есть следующая JTable, которая отображается при нажатии кнопки:

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

Я хочу сделать ячейки, которые изначально были истинными для JCheckBoxи все ячейки, которые были изначально ложными, чтобы ничего не отображать (без JCheckBox).Пользователь может проверять или снимать флажки JCheckBox в ячейках, которые изначально были истинными, что могло бы что-то сделать с созданной мной диаграммой.

Прямо сейчас мой рендерер ячеек отображает 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, но он не работал.Я думаю об использовании нескольких рендеров клеток для выполнения этой задачи.Возможно ли это сделать?Любой совет будет принята с благодарностью!

Ответы [ 2 ]

5 голосов
/ 09 октября 2011

Хранить 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);
    }

};

При таком подходе нет необходимости в пользовательских средствах визуализации или редакторах.

3 голосов
/ 07 октября 2011

У getTableCellRendererComponent вернуть пустой JLabel, если начальное значение было ложным.

...