ОБНОВЛЕНИЕ при создании модели пустой таблицы создайте два экземпляра 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;
}
});