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

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

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

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

Ответы [ 5 ]

3 голосов
/ 28 марта 2012

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

/**
 * 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);
    }
}
}
1 голос
/ 28 марта 2012

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

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);
1 голос
/ 09 мая 2009

Вы пытались создать 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);        
}
0 голосов
/ 14 июля 2010

Вместо создания Label, получите фактический компонент из 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 для примера этого.

0 голосов
/ 08 мая 2009

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

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

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

...