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

LDM*_*M91 4 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);
    }
   }
}
Run Code Online (Sandbox Code Playgroud)

原始代码来自kleopatra对如何将JTable列调整为字符串长度的答案,但是我已经更改了部件,因为我只想获得每个列标题的最小首选宽度,并在调整大小后存储它以供以后比较.

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

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

Gui*_*let 7

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

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

这是一个应该让你前进的片段:


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);
}
Run Code Online (Sandbox Code Playgroud)