【问题标题】:JTable set column width not workingJTable设置列宽不起作用
【发布时间】:2012-11-05 14:28:28
【问题描述】:

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

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

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

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

我无法理解我在哪里做错了。

【问题讨论】:

  • 注意String.length返回String中的字符数,而setPreferredWidth可能以像素表示(javadoc中没有真正提到,但这是最可能的情况)

标签: java swing jtable


【解决方案1】:

正如 Dan 所指出的,您需要根据所使用的字体来计算列名的实际宽度。

类似:

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

请注意,这是一个非常简短的示例。

如果您想完全正确,您需要查询每列的 renderer 以获取 Font 和 FontMetrics 以获得正确的值。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1 谢谢。你能告诉我如何将我的字符串长度转换为像素大小并将其设置为表格列宽
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 2010-10-31
        • 2012-09-15
        • 2013-02-16
        • 2013-10-01
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        相关资源
        最近更新 更多