2013-09-15 3 views
0

Что следует вызывать/запускать, когда я добавляю новый столбец в таблицу, но его метка заголовка имеет больше строк (с использованием html и br), чем в уже представленных заголовках, поэтому заголовки будут изменить размер соответственно?Высота заголовка столбца JTable после многократной вставки заголовка

Перед добавлением Before adding

После добавления enter image description here

Этого не происходит, если при первой картине таблицы столбец уже имеет то количество строк (если метка является <html>Card<br>name</html>).

enter image description here

я огонь fireTableStructureChanged() в TableModel при добавлении новой записи (поэтому новые столбцы добавляются).

+0

маленький намек fireTableStructureChanged(), чтобы сбросить все пользовательские Renderers/редакторы, потому что для этой работы, чтобы сбросить (все по умолчанию) этот метод обозначается – mKorbel

+0

К сожалению , но у меня есть проблема, полностью понимающая, что вы предложили. Особенно второй пост. Должен ли 'fireTableStructureChanged()' сбросить рендерер для заголовков? –

+0

[ваш SSCCE может быть основан на] (http://stackoverflow.com/q/9851253/714968) – mKorbel

ответ

2

Начиная с @mKorbel example, следующая кнопка изменяет внешний вид, как показано на рисунке. Способ setColumnIdentifiers() от DefaultTableModel вызывает от вашего имени fireTableStructureChanged(). Если вы продляете AbstractTableModel, вы должны сделать это в своем TableModel.

before after

Код:

private DefaultTableModel model = new DefaultTableModel(data, columnNames) {…} 
… 
frame.add(new JToggleButton(new AbstractAction("Toggle") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     JToggleButton b = (JToggleButton) e.getSource(); 
     if (b.isSelected()) { 
      columnNames[0] = "<html>String<br>of pearls</html>"; 
     } else { 
      columnNames[0] = "String"; 
     } 
     model.setColumnIdentifiers(columnNames); 
    } 
}), BorderLayout.SOUTH); 
+0

Вопрос в том, что 'fireTableStructureChanged()' заставляет обновить заголовок. Если да, то я вызываю его в своей реализации и не нуждаюсь в каких-либо других вызовах. Проблема, которую я обнаружил, по-видимому, с высотой заголовка столбца JScrollPane', я предоставил свою собственную реализацию с переопределенным 'getPreferredSize()' для управления высотой, и теперь она работает. Другой вопрос: почему это не обновляется после изменения высоты заголовка таблицы? (Я не буду размещать здесь код, так как он действительно сломан, а модульный и как-то трудно сформулировать кратко). –

+0

Да, 'fireTableStructureChanged()' должен обновлять заголовок. 'DefaultTableModel' вызывает' fireTableStructureChanged() 'для вас в' setColumnIdentifiers() '. 'JTable' реализует' Scrollable', поэтому переопределяет 'getPreferredScrollableViewportSize()' при необходимости. – trashgod