4

我试图防止我的 JTable 以标题小于它们所包含的文本大小的方式重新调整大小。我遇到的问题是,我为每个标题组件获得的最小首选宽度仅为 10,当每个标题组件中的值为“标题 1”、“标题 2”、“标题 3”等时,这显然太小了上。

我花了很多时间搜索 SO 并尝试实施各种建议,但到目前为止还没有找到解决方案。请查看我在扩展 JTable 中使用的当前代码:

public class MyTable extends JTable {

private Map<Integer, Integer> minSizeMap;

public void calculateMinColumnSizes() {

    int width = 0;
    int row = 0;
    minSizeMap = new HashMap<Integer, Integer>();

    for (int column = 0; column < columnModel.getColumnCount(); column++) {
        TableColumn tableColumn = columnModel.getColumn(column);
        TableCellRenderer renderer = tableColumn.getCellRenderer();
        Component comp = this.prepareRenderer(renderer, row, column);
        width = Math.max(comp.getPreferredSize().width, width);
        minSizeMap.put(tableColumn.getModelIndex(), width);
    }
   }
}

原始代码来自 kleopatra 对How to resize JTable column to string length 的回答?,但是我已经更改了部分,因为目前我只想获取每个列标题的最小首选宽度,并将其存储起来以供调整大小后进行比较。

在我调用该方法之前,所有模型都已设置好,所以当 TableColumn 的 minWidth 和 preferredWidth 默认值分别为 15 和 75 时,我对组件首选宽度如何获得 10 感到有些困惑。

关于我做错了什么/理解错误的任何想法?

4

1 回答 1

7

我在您的代码中看到了几个问题:

  1. 您不使用表格标题渲染器,而是使用 TableColumn 单元格渲染器(它们可能不同)
  2. 您测试第一行的首选大小,而不是标题
  3. 你使用width = Math.max(comp.getPreferredSize().width, width);which 根本没有任何意义

这是一个可以帮助您前进的片段:


for (int column = 0; column < columnModel.getColumnCount(); column++) {
    TableColumn tableColumn = columnModel.getColumn(column);
    TableCellRenderer renderer = tableColumn.getHeaderRenderer();
    if (renderer == null) {
        renderer = getTableHeader().getDefaultRenderer();
    }
    Component component = renderer.getTableCellRendererComponent(this, 
             tableColumn.getHeaderValue(), false, false, -1, column);
    minSizeMap.put(tableColumn.getModelIndex(), component.getPreferredSize().width);
}
于 2012-05-29T22:30:50.653 回答