如何获取JTable列的标头组件的最小首选宽度,以使其不能调整为小于值的大小?

时间:2012-05-29 22:09:33

标签: java swing header jtable tablecolumn

我试图阻止我的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?的回答,但是我已经更改了部分,因为我只想获得每个列标题的最小首选宽度,并在调整大小后存储它以供以后比较。 / p>

在调用方法之前已经设置了所有模型,所以当TableColumn的minWidth和preferredWidth默认值分别为15和75时,我对组件首选宽度的得分有点感到困惑。 / p>

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

1 个答案:

答案 0 :(得分:6)

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

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


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