Разделители столбцов в JTable или JXTable - PullRequest
3 голосов
/ 03 января 2012

У меня есть JTable (или, если быть более точным, JXTable) с 3 секциями сгруппированных столбцов, которые я хочу разделить.Раньше у меня было 3 таблицы, которые я программно связывал (положение полосы прокрутки, сортировка, выбор).Я использовал много кода, чтобы связать это, и я хочу избавиться от этого.Теперь я переключаюсь на 1 JXTable, потому что в этом табличном классе есть вещи, которые намного приятнее.

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

Вариант 1: пустой столбец в качестве разделителя (другой цвет, например серый) и программно перепрыгивайте через этот пустой столбец при использовании стрелок или клавиш табуляции.

вариант 2: установка поля только для 1 стороны 1 столбца в большем размере, поэтому он выглядит как разделитель.До сих пор я только узнал, как установить поля для всех столбцов

вариант 3: снова вернуться к 3 отдельным таблицам (особенно для того, чтобы отсортировать таблицы таким же образом, это большая работа, потому что яне хочу повторять столбцы в отдельных разделах).Это означает, что мне нужно переписать сортировщик таблицы, отсортировав его по невидимому столбцу.

приветствуется любое предложение (даже если это не один из трех заданных параметров)

1 Ответ

4 голосов
/ 03 января 2012

Я сделал нечто, похожее на то, что вы собираетесь, переопределив средство визуализации ячеек в 3-м столбце, чтобы иметь толстую правую границу и никаких других границ. Вы можете сделать то же самое в заголовке столбца таблицы, чтобы граница проходила там. Он четко размещает границу внутри ячейки, но этого может быть достаточно для вас.

  {
    ....
    table.getColumnModel().getColumn(2).setCellRenderer(
        new ThickRightBorderCellRenderer());
    ....
  }

  private static class ThickRightBorderCellRenderer
          extends DefaultTableCellRenderer {

    @Override
    public Border getBorder() {
      return BorderFactory.createMatteBorder(0, 0, 0, 3, Color.BLACK);
    }
  }

Example

...