Java JTable设置列宽

Ham*_*aya 89 java size swing jtable

我有一个JTable,我在其中设置列大小如下:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但是当表格最大化时,我会在最后一列的右边找到空白区域.是否可以在调整大小时将最后一列调整到窗口末尾?

AUTO_RESIZE_LAST_COLUMN在docs中找到了属性,但它不起作用.

编辑:JTable是在JScrollPane其首选大小设置.

Edd*_*die 42

如果你调用会发生什么setMinWidth(400)在最后一列,而不是setPreferredWidth(400)

在JavaDoc for中JTable,doLayout()非常仔细地阅读文档.以下是一些选择位:

当由于调整封闭窗口的大小而调用该方法时,resizingColumn为null.这意味着调整大小发生在JTable"外部",并且更改 - 或"delta" - 应该分配给所有列,而不管这个JTable的自动调整大小模式.

这可能就是为什么AUTO_RESIZE_LAST_COLUMN没有帮助你.

注意:当JTable调整列的宽度时,它绝对尊重它们的最小值和最大值.

这表示您可能希望为除最后一列之外的所有列设置Min == Max,然后在最后一列上设置Min = Preferred,并且不设置Max或为Max设置一个非常大的值.

  • 确保在应用表格模型之后执行setMinWidth调用*...这让我绊倒了一段时间. (3认同)
  • 尝试添加setMaxWidth(10000)以查看是否有所不同. (2认同)

akf*_*akf 21

使用时JTable.AUTO_RESIZE_OFF,表格不会为您更改任何列的大小,因此它将采用您的首选设置.如果您的目标是将列默认设置为首选大小,除了让最后一列填充窗格的其余部分之外,您可以选择使用JTable.AUTO_RESIZE_LAST_COLUMNautoResizeMode,但在使用TableColumn.setMaxWidth()而不是TableColumn 时可能最有效. setPreferredWidth()除了最后一列以外的所有列.

一旦你对AUTO_RESIZE_LAST_COLUMN实际工作感到满意,你就可以尝试结合使用TableColumn.setMaxWidth()TableColumn.setMinWidth()


Ric*_*pek 11

JTable.AUTO_RESIZE_LAST_COLUMN定义为"在所有调整大小操作期间,仅对最后一列应用调整",这意味着您必须在代码末尾设置autoresizemode,否则setPreferredWidth()不会影响任何内容!

所以在你的情况下,这将是正确的方法:

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
Run Code Online (Sandbox Code Playgroud)


Ole*_*lov 5

使用此方法

public static void setColumnWidths(JTable table, int... widths) {
    TableColumnModel columnModel = table.getColumnModel();
    for (int i = 0; i < widths.length; i++) {
        if (i < columnModel.getColumnCount()) {
            columnModel.getColumn(i).setMaxWidth(widths[i]);
        }
        else break;
    }
Run Code Online (Sandbox Code Playgroud)

或者扩展JTable课程:

public class Table extends JTable {
    public void setColumnWidths(int... widths) {
        for (int i = 0; i < widths.length; i++) {
            if (i < columnModel.getColumnCount()) {
                columnModel.getColumn(i).setMaxWidth(widths[i]);
            }
            else break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

table.setColumnWidths(30, 150, 100, 100);
Run Code Online (Sandbox Code Playgroud)