2

我尝试为列设置宽度,但它根本不起作用,我一直在寻找答案几个小时,这是我的代码,谁能告诉我问题出在哪里。提前致谢。

    String [] columns = {"Day","StratTime","EndTime","Description"};
    mtbl = new DefaultTableModel();

    tbl = new JTable(mtbl);
    jsPane = new JScrollPane(tbl);

    tbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);


    for (int i = 0; i < Timedcolumns.length; i++) {
        mtbl.addColumn(columns[i]);
        tbl.getColumnModel().getColumn(i).setPreferredWidth(100);
    }
4

2 回答 2

2

由于addColumn(),JTable可能最终重建所有列。这是一个片段JTable.tableChanged()

public void tableChanged(TableModelEvent e) {
    if (e == null || e.getFirstRow() == TableModelEvent.HEADER_ROW) {
        ...

        if (getAutoCreateColumnsFromModel()) {
    // This will effect invalidation of the JTable and JTableHeader.
            createDefaultColumnsFromModel();
    return;
    }
        ...

TableModelEvent.HEADER_ROWaddColumn()由于执行的结果而被解雇DefaultTableModeladdColumn执行fireTableStructureChanged

public void fireTableStructureChanged() {
    fireTableChanged(new TableModelEvent(this, TableModelEvent.HEADER_ROW));
} 

您最终仅在添加的最后一列上设置首选大小,因为其余列由createDefaultColumnsFromModel().

总而言之,在单独的循环中创建所有列之后设置首选大小可能更简单。

于 2012-09-24T03:40:41.337 回答
1

我发现除了设置列的 PreferredWidth 之外,设置 maxWidth 也很有帮助。根据您要完成的任务,您可能还希望设置 minWidth。

 for (int i = 0; i < Timedcolumns.length; i++) {
     mtbl.addColumn(columns[i]);
     tbl.getColumnModel().getColumn(i).setPreferredWidth(100);
     tbl.getColumnModel().getColumn(i).setMaxWidth(100);
 }
于 2012-09-24T03:08:58.807 回答