Java JTable设置列宽

时间:2009-06-05 02:04:31

标签: java swing size 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);

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

我在文档中找到了AUTO_RESIZE_LAST_COLUMN属性,但它不起作用。

修改:JTable位于JScrollPane,其首选大小已设置。

9 个答案:

答案 0 :(得分:42)

如果您在setMinWidth(400)的最后一列而不是上致电setPreferredWidth(400)会怎样?

JTable的JavaDoc中,请仔细阅读doLayout()的文档。以下是一些选择位:

  

当通过调整封闭窗口的大小来调用方法时,   resizingColumn为null。这意味着调整大小发生在JTable“外部”   并且更改 - 或“delta” - 应该分配给所有列,而不管是什么   这个JTable的自动调整大小模式。

这可能是AUTO_RESIZE_LAST_COLUMN没有帮助你的原因。

  

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

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

答案 1 :(得分:22)

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

如果您对AUTO_RESIZE_LAST_COLUMN确实有效,您可以尝试TableColumn.setMaxWidth()TableColumn.setMinWidth()的组合

答案 2 :(得分:11)

JTable.AUTO_RESIZE_LAST_COLUMN定义为“在所有调整大小操作期间,仅对最后一列应用调整”,这意味着您必须在代码末尾设置 autoresizemode < / strong>,否则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);

答案 3 :(得分: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;
    }

或者扩展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;
        }
    }
}

然后

table.setColumnWidths(30, 150, 100, 100);

答案 4 :(得分:4)

阅读Kleopatra的评论(她第二次建议看看javax.swing.JXTable,现在我很抱歉我第一次看不到:)) 我建议你按照链接

我有同样问题的解决方案:(但我建议你按照上面的链接) 在调整表的大小时,将表列宽度缩放到当前表的总宽度。 要做到这一点,我使用全局数组的int(相对)列宽度):

private int[] columnWidths=null;

我使用此函数来设置表格列宽:

public void setColumnWidths(int[] widths){
    int nrCols=table.getModel().getColumnCount();
    if(nrCols==0||widths==null){
        return;
    }
    this.columnWidths=widths.clone();

    //current width of the table:
    int totalWidth=table.getWidth();

    int totalWidthRequested=0;
    int nrRequestedWidths=columnWidths.length;
    int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols);

    for(int col=0;col<nrCols;col++){
        int width = 0;
        if(columnWidths.length>col){
            width=columnWidths[col];
        }
        totalWidthRequested+=width;
    }
    //Note: for the not defined columns: use the defaultWidth
    if(nrRequestedWidths<nrCols){
        log.fine("Setting column widths: nr of columns do not match column widths requested");
        totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
    }
    //calculate the scale for the column width
    double factor=(double)totalWidth/(double)totalWidthRequested;

    for(int col=0;col<nrCols;col++){
        int width = defaultWidth;
        if(columnWidths.length>col){
            //scale the requested width to the current table width
            width=(int)Math.floor(factor*(double)columnWidths[col]);
        }
        table.getColumnModel().getColumn(col).setPreferredWidth(width);
        table.getColumnModel().getColumn(col).setWidth(width);
    }

}

设置我调用的数据时:

    setColumnWidths(this.columnWidths);

并且在更改时我调用ComponentListener设置为表的父级(在我的例子中是JScrollPane,它是我的表的容器):

public void componentResized(ComponentEvent componentEvent) {
    this.setColumnWidths(this.columnWidths);
}

请注意,JTable表也是全局的:

private JTable table;

在这里我设置了听众:

    scrollPane=new JScrollPane(table);
    scrollPane.addComponentListener(this);

答案 5 :(得分:1)

fireTableStructureChanged();

将默认调整大小行为!如果在代码中某处调用此方法,则在设置列调整大小属性后,将重置所有设置。这种副作用可以间接发生。 F.E.因为链接数据模型在调用此方法的方式中被更改,所以在设置属性之后。

答案 6 :(得分:1)

不需要该选项,只需将最后一列的首选宽度设为最大,这将占用所有多余的空间。

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(Integer.MAX_INT);

答案 7 :(得分:0)

使用此代码。它对我有用。我考虑了3列。更改代码的循环值。

TableColumn column = null;
        for (int i = 0; i < 3; i++) {
            column = table.getColumnModel().getColumn(i);
            if (i == 0) 
                column.setMaxWidth(10);
            if (i == 2)
                column.setMaxWidth(50);
        }

答案 8 :(得分:0)

此代码在没有setAutoResizeModes的情况下适用于我。

        TableColumnModel columnModel = jTable1.getColumnModel();
        columnModel.getColumn(1).setPreferredWidth(170);
        columnModel.getColumn(1).setMaxWidth(170);
        columnModel.getColumn(2).setPreferredWidth(150);
        columnModel.getColumn(2).setMaxWidth(150);
        columnModel.getColumn(3).setPreferredWidth(40);
        columnModel.getColumn(3).setMaxWidth(40);