установка значения прототипа (для автоматического расчета ширины) столбца JTable

StackOverflow https://stackoverflow.com/questions/838095

Вопрос

или этого не существует, или я не думаю / ищу правильно, потому что уже поздно ...

Я хочу установить ширину столбца JTable в Swing на основе значения прототипа для наибольшей строки, которую я ожидаю (или знаю), существующей в определенном столбце. Я не знаю количество пикселей, так как не обязательно знаю шрифт во время компиляции.

Есть ли способ установить значение прототипа для целей ширины столбца, как для целей высоты строки? Если да, то как?

Это было полезно?

Решение

Вы пытались создать JLabel во время выполнения и использовать его размер для изменения размера таблицы?

// create a label that will be using the run-time font
JLabel prototypeLabel = new JLabel("Not Applicable")

// get the labels preferred sizes
int preferredWidth = prototypeLabel.getPreferredSize().getWidth();
int preferredHeight = prototypeLabel.getPreferredSize().getHeight();

// set the sizes of the table's row and columns
myTable.setRowHeight(preferredHeight);

for(TableColumn column : myTable.getColumnModel.getColumns()){
   column.setPreferredWidth(preferredWidth);        
}

Другие советы

Вы можете попробовать следующий код:

/**
 * Sets the preferred width of the columns of a table from prototypes
 * @param table the target table
 * @param prototypes an array of prototypes, {@code null} values will be ignored
 * @param setMaxWidth {@code true} if the maximum column width should also be set
 */
public static void setWidthFromPrototype(JTable table, Object[] prototypes, boolean setMaxWidth) {
if (prototypes.length != table.getColumnCount())
  throw new IllegalArgumentException("The prototypes array should contain exactly one element per table column");
for (int i = 0; i < prototypes.length; i++) {
    if (prototypes[i] != null) {
        Component proto = table.getCellRenderer(0,i)
                .getTableCellRendererComponent(table, prototypes[i], false, false, 0, i);
        int prefWidth = (int) proto.getPreferredSize().getWidth() + 1;
        table.getColumnModel().getColumn(i).setPreferredWidth(prefWidth);
        if (setMaxWidth)
            table.getColumnModel().getColumn(i).setMaxWidth(prefWidth);
    }
}
}

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

for(int col = 0; ....) {
    table.getColumnExt(col).setPrototypeValue(myPrototype[col]
}

или путем реализации пользовательского ColumnFactory, который настраивает столбцы при создании

ColumnFactory factory = new ColumnFactory() {
    @Override
    protected void configureTableColumn(TableModel model, TableColumnExt columnExt) {
        super(...);
        columnExt.setPrototypeValue(myPrototype[columnExt.getModelIndex()];
    }
}
table.setColumnFactory(factory);
table.setModel(myModel);

Вместо создания метки получите фактический компонент из TableCellRenderer и проверьте его размер:

// create the component that will be used to render the cell
Comp prototype = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, "Not Applicable", false, false, 0, i);

// get the labels preferred sizes
int preferredWidth = comp.getPreferredSize().getWidth();
int preferredHeight = comp.getPreferredSize().getHeight();

Это пример с одним столбцом, вам нужно будет повторить это, чтобы получить размер для каждого столбца (а также установить его). См. http://www.exampledepot.com/egs/javax.swing. .table / PackCol.html для примера этого.

Если вы не знаете шрифт во время компиляции, тогда ширина любого столбца JTable всегда будет неизвестна. В качестве проверки работоспособности откройте текстовый документ и поиграйте с разными шрифтами, сохраняя при этом размер точки постоянным. Длина написанного варьируется в зависимости от шрифта, а высота - нет.

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

Если вы не можете гарантировать ни размер шрифта, ни сам шрифт во время компиляции, мне интересно, что ответят другие люди:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top