2012-09-24 68 views
2

我尝试为列设置宽度,但它根本无法工作,我一直在寻找答案的小时,这里是我的代码,任何人都可以告诉我什么是问题。提前致谢。Java JTable不能设置列的宽度

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

回答

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_ROW被触发为addColumn()执行由DefaultTableModel的结果。 addColumn执行fireTableStructureChanged

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

你最终只在添加的最后一列设置首选大小,列的其余部分是由createDefaultColumnsFromModel()重建。

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

+0

谢谢你,那就是我意识到的 –

+0

@GaZhua不客气! :) – tenorsax

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); 
} 
+0

呵呵,我意识到需要将addColumn和setWidth分开在不同的循环中,那么它将起作用 –