Ответ 1
Отвечая на мой собственный вопрос:
Если JTable построен с TableModel но без TableColumnModel JTable создаст TableColumnModel, используя createDefaultColumnModel() и установите autoCreateColumnsFromModel значение true. Когда это свойство истинно, JTable заполнит TableColumnModel со значениями из TableModel.
Никто, кажется, не гарантирует синхронизацию этих двух. Случай, JTable.getColumnName() вернет TableModel, независимо от того, что фактически отображает TableColumnModel на экране.
Еще одна интересная вещь, которую я заметил, заключается в том, что TableModel ограничивается столбцами String, тогда как TableColumnModel позволяет передать любой объект в TableCellRenderer. Javadoc говорит, что значения ограничены строками, но на самом деле это специфично для реализации. Ничто не мешает вам написать реализацию, использующую значение JComponent.
В заключение: TableColumnModel является конечным владельцем значений столбцов. TableColumnModel запрашивает TableModel для значений, только если у него его еще нет. Например, в случае, когда вы передаете столбец в JTable.addColumn() без указания значения заголовка.