动态设置TableColumns的宽度

时间:2012-02-29 10:12:00

标签: java swing jtable column-width

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

干扰表的内部列布局并非易事(基本上,它是自己的LayoutManager,列为“子”)。好的一面:默认行为并不坏,它已经有了合理的调整大小模式。默认的resizeAll最有可能做你想要的只需要一点配置 - 这不是过分直觉: - )

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

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

(使用postFix I分别表示单个列和各个值的总和),即max / pref与max / pref之和的个体差异的因子。看起来是一个合理的决定,只是...默认最大值为Integer.MAX,所有列的因子大致相同,无论它们的前提是什么。这基本上就是为什么调整大小看起来如此不直观以及为什么你需要调整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是一个任意幻数,你可能想用它玩一下,这取决于屏幕分辨率和用户期望