Как изменить размер столбца JTable на длину строки?
У меня есть JTable, который изменит поле данных последнего столбца на разные строковые значения. Я хочу изменить размер столбца на длину строки. Какова формула для длины строки по ширине?
Я собираюсь использовать JTable.getColumnModel().getColumn().setPreferredWidth()
, поэтому я хочу знать, как перевести длину строки в значение ширины.
Ответы
Ответ 1
вас действительно не интересует длина строки (а также ее сопоставление с определенным шрифтом/метрикой). Вас интересует предпочтительный размер renderComponent, который визуализирует содержимое ячейки. Чтобы получить это, пропустите все строки и запросите размер, что-то вроде
int width = 0;
for (row = 0; row < table.getRowCount(); row++) {
TableCellRenderer renderer = table.getCellRenderer(row, myColumn);
Component comp = table.prepareRenderer(renderer, row, myColumn);
width = Math.max (comp.getPreferredSize().width, width);
}
Или используйте JXTable (в проекте SwingX): у него есть метод pack(), который выполняет вашу работу: -)
Изменить: причина предпочтения таблицы prepareRenderer по ручному вызову getXXRendererComponent в рендерере заключается в том, что таблица может украсить визуальные свойства renderComponent. Если эти декорации влияют на prefSize компонента, ручная настройка отключена.
Ответ 2
Этот метод упакует данный столбец в JTable -
/**
* Sets the preferred width of the visible column specified by vColIndex. The column
* will be just wide enough to show the column head and the widest cell in the column.
* margin pixels are added to the left and right
* (resulting in an additional width of 2*margin pixels).
*/
public static void packColumn(JTable table, int vColIndex, int margin) {
DefaultTableColumnModel colModel = (DefaultTableColumnModel)table.getColumnModel();
TableColumn col = colModel.getColumn(vColIndex);
int width = 0;
// Get width of column header
TableCellRenderer renderer = col.getHeaderRenderer();
if (renderer == null) {
renderer = table.getTableHeader().getDefaultRenderer();
}
java.awt.Component comp = renderer.getTableCellRendererComponent(
table, col.getHeaderValue(), false, false, 0, 0);
width = comp.getPreferredSize().width;
// Get maximum width of column data
for (int r=0; r<table.getRowCount(); r++) {
renderer = table.getCellRenderer(r, vColIndex);
comp = renderer.getTableCellRendererComponent(
table, table.getValueAt(r, vColIndex), false, false, r, vColIndex);
width = Math.max(width, comp.getPreferredSize().width);
}
// Add margin
width += 2*margin;
// Set the width
col.setPreferredWidth(width);
}
Ответ 3
Table Column Adjuster работает как статически, так и динамически, и пользователь может контролировать это.