views:

744

answers:

3

either this doesn't exist, or I'm not thinking/searching correctly because it's late...

I want to set a JTable column width in Swing based on a prototype value for the largest string I expect (or know) to exist in a particular column. I don't know the # of pixels since I don't necessarily know the font at compile time.

Is there a way to set a prototype value for column width purposes, the way there is for row height purposes? If so, how?

A: 

If you don't know the font at compile time then the width of any JTable column is always going to be unknown. As a sanity check, open a text document and play with different fonts whilst keeping the point size constant. The length of what is written varies on a font-by-font basis but the height doesn't.

The height of a JTable row should be able to be determined for any font size (in points) as it is a defined standard. It might take a bit of experimenting, though, given that JTable probably gives a bit of spacing inbetween cells.

If you can't guarantee neither the font size nor the font itself at compile time then I'm interested in what answers other people come up with :)

Catchwa
"the width of any JTable column is always going to be unknown." ??? I have some example text, e.g. "Not Applicable" that I want to use as the maximum column width. Surely at runtime, when the font is known, it is possible to determine column width from that?
Jason S
+2  A: 

Have you tried creating a JLabel at run time and using its size to resize your table?

// 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);        
}
Andrew
oh, that's clever. Is there any way I can be sure the JLabel and the table column entries use the same font?
Jason S
It would probably depend on whatever font your TableCellRenderer was using. If you had access to the renderer(s), and they were JLabel's as well, you could create your prototype label using the same font with something like:JLabel prototypeLabel = new JLabel("Not Applicable");prototypeLabel.setFont(cellRenderer.getFont())
Andrew
A: 

Instead of creating a Label, get the actual component from the TableCellRenderer and test the size on that:

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

This is a single column example, you'll need to repeat this to get the size for each column (and also set it). See http://www.exampledepot.com/egs/javax.swing.table/PackCol.html for an example of this.

tukushan
??? And how does this reflect the width/height of a particular maximum-length string? I want my column that can contain "$222.22" to be a smaller width than the one that can contain "Miscellaneous grocery purchases".
Jason S
This is a single column example, you'll need to repeat this to get the size for each column (and also set it). See http://www.exampledepot.com/egs/javax.swing.table/PackCol.html for an example of this. The JLabel answer will have the same problem because you are setting every column to the same preferred width.
tukushan