2009-05-08 3 views
4

либо это не существует, или я не думаю/правильно искать, потому что поздно ...установки значения прототипа (для автоматического расчета ширины) столбца JTable

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

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

ответ

1

Вы пытались создать 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

О, это умно. Есть ли какой-нибудь способ, которым я могу быть уверен, что записи JLabel и столбец таблицы используют один и тот же шрифт? –

+0

Вероятно, это зависит от того, какой шрифт использовал ваш TableCellRenderer. Если у вас был доступ к средствам визуализации, и они были также JLabel, вы могли бы создать свою метку прототипа с использованием того же шрифта с чем-то вроде: JLabel prototypeLabel = новый JLabel («Не применимо»); prototypeLabel.setFont (cellRenderer.getFont()) – Andrew

+1

-1 Не рекомендуется использовать произвольный компонент для измерения размера. Вместо этого используйте компонент рендеринга в соответствии с таблицей – kleopatra

-1

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

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

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

+0

"ширина любого столбца JTable всегда будет неизвестна." ??? У меня есть пример текста, например. «Не применимо», которое я хочу использовать в качестве максимальной ширины столбца. Разумеется, во время выполнения, когда шрифт известен, можно определить ширину столбца? –

0

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

??? И как это отражает ширину/высоту конкретной строки максимальной длины? Я хочу, чтобы моя колонка могла содержать «$ 222.22 ", чтобы быть меньшей шириной, чем та, которая может содержать« Разное покупки бакалеи ». –

+0

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

3

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

/** 
* 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); 
    } 
} 
} 
+0

использовать его , просто вызовите setWidthFromPrototype (myTable, новый Object [] {«Не применимо»}); –

+0

поддерживается для измерения компонента, предоставляемого рендерером, - просто получение рендерера неверно: вы должны спросить таблицу для него (table.getRenderer (строка, столбец)), в противном случае вы пропустите рендеринг для столбцов - пожалуйста, отредактируйте для совершенства :-) – kleopatra

+0

спасибо за предложения @kleopatra, но я не вижу метод 'JTable.getRenderer (int, int)' Во всех случаях я думаю, что 'getDefaultRenderer' более безопасен, так как i t возвращает средство визуализации, связанное с типом, что может быть полезно, если вы не хотите создавать полный экземпляр объекта и, например, просто передаете его строковое представление. –

1

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);