动态设置表列的宽度


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]));
        }
干扰

表的内部列布局并非易事(基本上,它是它自己的布局管理器,列是"子级"(。好的一面是:默认行为还不错,它已经具有合理的调整大小模式。默认的 resizeAll 很可能只需要一点点配置就可以完成您想要的 - 这并不太直观:-(

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

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

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

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

// 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是一个任意的幻数,您可能想玩一下,这取决于屏幕分辨率和用户期望

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

此外,默认情况下,列会根据表大小更改自动调整大小,您还应该检查自动调整大小模式。

相关内容

  • 没有找到相关文章

最新更新