JTable设置列宽不起作用

时间:2012-11-05 14:28:29

标签: java swing jtable

我正在尝试将列宽设置为列名的长度。我的问题是,我无法设置它。当我使用以下代码时,表格变得像这样,

tableA.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  for(int i = 0; i < tableA.getColumnCount(); i++) {
int columnLength = (modelA.getColumnName(i)).length();
tableA.getColumnModel().getColumn(i).setPreferredWidth(columnLength);
//  tableA.getColumnModel().getColumn(i).setMinWidth(columnLength);
//  tableA.getColumnModel().getColumn(i).setMaxWidth(columnLength);
  }

我从表格模型中正确获取了列长度。

当我使用上面的代码时,表格会像这样包装,

Set Column Width

我无法理解我做错了什么。

4 个答案:

答案 0 :(得分:5)

正如Dan指出的那样,您需要根据正在使用的Font计算列名的实际宽度。

类似的东西:

String name = modelA.getColumnName(i);
Font f = tableA.getFont();
FontMetrics fm = tableA.getFontMetrics(f);
int width = fm.stringWidth(name);
tableA.getColumnModel().getColumn(i).setPreferredWidth(width);

请注意,这是一个极其简短的例子。

如果要完全正确,则需要查询每个列的渲染器以获取Font和FontMetrics,以获取正确的值。

如果所有渲染器都使用与JTable相同的字体,那么这应该没问题。

答案 1 :(得分:3)

setPreferredWidth需要一个以像素为单位的值,而列名称的长度是String的长度(String中的字符数)。

答案 2 :(得分:2)

如果您不介意使用SwingX,可以使用TableColumnExt#setPrototypeValue方法,该方法允许您设置一个'原型'值,用于确定列宽。

答案 3 :(得分:2)

相关问题