Как изменить размер столбца JTable до длины строки? - PullRequest
11 голосов
/ 28 апреля 2011

У меня есть JTable, в котором поле данных последнего столбца изменяется на разные строковые значения.Я хочу изменить размер столбца до длины строки.Какова формула для длины строки в ширину?

Я собираюсь использовать JTable.getColumnModel().getColumn().setPreferredWidth(), поэтому я хочу знать, как перевести длину строки в значение ширины.

Ответы [ 3 ]

15 голосов
/ 28 апреля 2011

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

 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 компонента, ручная конфигурация отключена.

5 голосов
/ 28 апреля 2011

Этот метод упаковывает данный столбец в 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);
}
4 голосов
/ 28 апреля 2011

Регулятор столбцов таблицы работает как статически, так и динамически, и пользователь может контролировать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...