Могу ли я сделать столбец JTable без границ? - PullRequest
5 голосов
/ 11 июля 2010

Я создал столбец с ячейками, которые содержат внутри JTextArea + A JButton, как вы можете видеть на изображении ниже в столбце 3:

alt text

Но у меня естьстолкнулся с множеством проблем с моими CellRenderer и CellEditor при обновлении значений ячеек в этом столбце, так как мой код немного сложен.Поэтому вместо этого я хочу заменить этот столбец на 2 столбца.Один столбец должен иметь нормальных строковых ячеек , а другой - ячеек JButton , но эти 2 столбца должны выглядеть так же, как столбец 3 на изображении выше. Итак, мои вопросы :

1.Как я могу объединить заголовки 2 столбцов вместе?

2.Как я могу удалить левые границы столбца JButtons?

Если они зафиксированы, таким образом 2 столбца будут выглядеть так же, как на изображении выше + обновление значений ячеек будет намного проще.

-------------------------------- Редактировать: Проблемы с примером кода:

Хорошо, ребята ... Вы просили об этом.Мой код огромен, но если вы можете помочь мне исправить это, это было бы идеально.Я создал образец jar для своей проблемы и включил в него и мой исходный код.Вы можете скачать его здесь:

Образец баночки

Проблема в том, что я использую кнопку, чтобы разрешить сортировку строк таблицы (перемещать их вверх / вниз), но когдая делаю это, некоторые значения перемещенных ячеек не обновляются!

Вы видите следующий снимок экрана: alt text Проблема в редакторе я использую ... Но я не могу это исправить.

Ответы [ 2 ]

2 голосов
/ 11 июля 2010

ОБНОВЛЕНИЕ при создании модели пустой таблицы создайте два экземпляра ButtonCellRenderer (вместо 4) и установите один экземпляр как редактор и средство визуализации для столбца 2, а второй - для столбца 3 Исправлено отображение неверных значений при перемещении строк, но иногда при наведении курсора отображается пустая ячейка.

А если код не работает, перезапуск редактирования ячеек при каждом перемещении мыши может вызвать проблемы, поскольку вы переключаетесь между редактором ячеек и средством визуализации при каждом перемещении мыши. Я не мог редактировать какие-либо значения, даже если вы используете JTextArea (который должен быть JTextField). Воссоздание табличной модели каждый раз при изменении порядка строк - это нормально, но лучше создать класс, который будет содержать значения для всех столбцов, и использовать вектор этих классов в качестве модели таблицы. Таким образом, вы можете изменить порядок значений в векторе, и модель таблицы будет обновлена.

Если вы хотите объединить два заголовка, переопределите getHeaderRect(int col) из JTableHeader, чтобы вернуть объединение super.getHeaderRect () для двух столбцов. Вам также может понадобиться переопределить метод paint () BasicTableHeaderUI, чтобы закрасить широкий заголовок поверх двух предыдущих.

Это подход, который я использовал для объединения ячеек таблицы, но он также должен работать для заголовков.

Извините, я не могу дать вам точный код. Лично я хотел бы написать пользовательский рендерер ячеек, т. Е. Ваш первый подход.

РЕДАКТИРОВАТЬ Если вы хотите использовать Metal LaF, этот код вроде как не рисует заголовок второго столбца:

    final TableCellRenderer defaultRenderer = getTableHeader().getDefaultRenderer();
    getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            JLabel c = (JLabel) defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (column == 1)
                c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, Color.gray));
            else if (column == 2) {
                c.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 1, Color.gray));
                c.setText(null);
            } else
                c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray));
            return c;
        }
    });
0 голосов
/ 11 июля 2010

Вы можете создать JButton без рамки (пустая граница), который реализует TableCellRenderer?

...