1
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f };

setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

for (int i = 0; i < cwidth.length; i++) {
            getColumnModel().getColumn(i).setPreferredWidth((int) (getPreferredScrollableViewportSize().width * cwidth[i]));
        }

我有以下问题:

我有一个 5 列的 JTable。第一个是 3 位数字,第二个是字符串,然后是 JProgressBar,另一个字符串和一个按钮。

现在我希望它们的宽度取决于表格的大小。上面你可以看到我的实际尝试,但这不起作用。

我已经在网上搜索过,但我发现的一切都对我没有帮助,因为它总是关于将大小设置为非动态大小。

我希望你能帮助我。

谢谢您的帮助。我喜欢这一面!!

这是我的解决方案:

for (int i = 0; i < cwidth.length; i++) {
            getColumnModel().getColumn(i).setPreferredWidth((int) (600 * cwidth[i]));
            getColumnModel().getColumn(i).setMinWidth((int) (100 * cwidth[i]));
            getColumnModel().getColumn(i).setMaxWidth((int) (1000 * cwidth[i]));
        }
4

2 回答 2

2

如果首选宽度小于最小宽度或大于最大宽度,则您的列将不会按首选宽度调整大小。您还应该控制最小宽度和最大宽度,以确保您的首选宽度在它们之间。

此外,默认情况下,列会根据表格大小的变化自动调整大小,您也应该检查自动调整大小模式。

于 2012-02-29T10:19:11.180 回答
2

干扰表的内部列布局并非易事(基本上,它是它自己的 LayoutManager,列作为“子”)。好的一面是:默认行为并没有那么糟糕,它已经有一个合理的调整大小模式。默认的 resizeAll 很可能只需要一点配置就可以满足您的需求 - 这不是过于直观 :-)

首先,请阅读 JTable.doLayout() 的 api 文档 - 它描述了确切的行为。最重要的一点是要了解多余的宽度是如何跨列分布的:

deltaI = (excess) * ((maxI - prefI) / (maxAll - prefAll)) 

(用 postFix I 分别表示单个列和所有单个值的总和),即 max/pref 的个体差异与 max/pref 的总和的因子。看起来是一个合理的决定,只是......默认最大值为 Integer.MAX,对于所有列,该因素大致相同,而与它们的 prefWidht 无关。这基本上就是为什么调整大小看起来如此不直观以及为什么需要调整 maxSize (正如@Lajos Arpad 已经指出的:-) 以获得合理的默认调整大小行为。

因此,与其尝试自己动手(这不是一个好主意,与 LayoutManagers 一样),不如根据需要配置列属性:

// start out with a reasonable pref size, f.i. from a prototype or 
// measuring the actual cell content (both supported by JXTable)
forEachColumn
    column.setPreferredWidth(....);

// then configure the maxWidth proportionally 
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f };
forEachColumn
    int max = ((int) (1000f * cwidth[columnExt.getModelIndex()]));
    columnExt.setMaxWidth(max);

请注意,1000 是一个任意的幻数,您可能想玩一下它,这取决于屏幕分辨率和用户期望

于 2012-02-29T12:51:08.933 回答