Size Your Columns to Suit Your JTable’s Contents #21
Chapter 3, Tables and Trees
If it does, then we have a usability problem to discuss. By default, the col-
umns of a
JTable are all the same size. For this data, that’s obviously a terri-
ble decision—there’s far too much space reserved for the numbers in the
count column, and not nearly enough in the URL column. So, how are you
going to fix this?
If you said “turn on the horizontal scrollbar,” please close this book, grasp it
with both hands, and firmly smack yourself in the head with it. No, you are
not turning on the horizontal scrollbar! Use the pixels available to you
before you resort to the user-annoying desperation of horizontal scrolling. In
this case, the count column has lots of pixels to spare; you just need to real-
locate this extra space to the URL column.
Resetting Column Widths
What makes programmatic column resizing difficult for many Swing pro-
grammers is that they can’t even find the right methods to use. If all you ever
work with is
JTable (and maybe a few custom cell renderers), you’ll notice
that the JavaDoc for those classes says nothing about column widths. The
problem may be that the
JTable is so generous with helpful methods that
you’d never even notice that it’s made up of
TableColumn objects. Take a
look at that
TableColumn’s JavaDoc, and you’ll find getters and setters for
minimum, maximum, and preferred widths for columns.
As with components that defer to layout managers, the right property to
reset is the preferred width—let the column tell the
JTable how wide it
would like to be, but let the
JTable make the final decision based on the
information available to it (after all, there could be other columns contend-
ing for space, there might not be enough space for all the columns’ pre-
ferred size, etc.).
Given that the key to this hack will be calling
setPreferredWidth( ) on the
TableColumns, the obvious question is: what value should you use for the
preferred width? Here’s a strategy: assuming you already have the table data,
use the width of the widest item in the column. And how do you get that?
By using the table’s cell renderers to actually figure out how big each cell
ColumnResizer, shown in Example 3-1, has a single static method,
adjustColumnPreferredWidths( ), which takes a JTable as its only argument.
Yes, the name is a mouthful, but it’s helpful to express
exactly what the method does.