2011-12-03 150 views
11

我想添加一些列到表(Swing JTable)。其中一些將具有默認大小(例如250),其他將被隱藏(因此它們的大小將爲0)。我用這個代碼:JTable隱藏並顯示列

model = new DefaultTableModel(); 
table = new JTable(model); 
setAutoResizeMode(AUTO_RESIZE_OFF); 
for (int i = 1; i < COLUMN_NAMES.length; i++) { 
    model.addColumn(COLUMN_NAMES[i]); 
    if (show[i]) show(index); 
    else hide(index); 
} 
........ 

private void hide(int index) { 
    TableColumn column = getColumnModel().getColumn(index); 
    column.setMinWidth(0); 
    column.setMaxWidth(0); 
    column.setWidth(0); 
    column.setPreferredWidth(0); 
    doLayout(); 
} 

private void show(int index) { 
    final int width = 250; 
    column.setMinWidth(15); 
    column.setMaxWidth(width); 
    column.setWidth(width); 
    column.setPreferredWidth(width); 
    doLayout(); 
} 

問題是在顯示錶時,所有列都顯示(沒有隱藏)和它們的大小不是250,但他們有一樣的大小。

我如何得到想要的效果?

+3

請查看Swing-genius StanislavL的答案:[hide-column-in-jtable-temporary](http://stackoverflow.com/questions/5270032/hide-column-in-jtable-temporary) –

+0

不錯的鏈接:) +1 – mprabhat

回答

13

我想你已經正確命名你的方法,當你想隱藏的列,您將設置

column.setMinWidth(0); 
column.setMaxWidth(0); 
column.setPreferredWidth(0); 

但在你的代碼時,你要顯示的列是完全相反的,你在做這個。

此外,沒有必要在TableColumn上調用此「setWidth」方法,請閱讀TableColumn#setWidth(int)。只有從JTable中視圖

7

,而不是重新發明,它支持隱藏的列輪你可能會考慮使用JXTable(在the SwingX project),comlete與UI控制允許用戶動態地隱藏/顯示它們 - 以及其他一些有用的東西:)。

0
HashMap<String,TableColumn> hashMap_columns = new HashMap<String,TableColumn>(); 

    DefaultTableColumnModel defaultTableColumnModel = (DefaultTableColumnModel)jtable.getColumnModel(); 

    Enumeration<TableColumn> enumeration = defaultTableColumnModel.getColumns(); 

    while (enumeration.hasMoreElements()) 
    { 
      TableColumn tableColumn = enumeration.nextElement(); 

      hashMap_columns.put((String)tableColumn.getIdentifier(),tableColumn); 

    } 


    public void setColumnVisible(String identifier, boolean setVisible) 
    { 
      TableColumn tableColumn = hashMap_columns.get(identifier); 

      if (setVisible) 
      { 
       // using a sorted map removes the need to check column index/position 
       SortedMap<Integer,TableColumn> sortedMap = new TreeMap<Integer,TableColumn>(); 

       // retreive all visible columns 
       Enumeration<TableColumn> enumeration = defaultTableColumnModel.getColumns(); 

       while (enumeration.hasMoreElements()) 
       { 
        TableColumn column = enumeration.nextElement(); 

        sortedMap.put(column.getModelIndex(),column); 
       } 

       // add the column of interest to the sorted map 
       sortedMap.put(tableColumn.getModelIndex(),tableColumn); 

       // remove all visible columns 
       for (TableColumn column: sortedMap.values()) 
       { 
        defaultTableColumnModel.removeColumn(column); 
       } 

       // add all previously visible columns as well as the column of interest 
       for (TableColumn column: sortedMap.values()) 
       { 
        defaultTableColumnModel.addColumn(column); 
       } 
      } 
      else 
      { 
       defaultTableColumnModel.removeColumn(tableColumn); 
      } 
     } 
6

試試這個是這樣的,例如:

myTableModel = new DefaultTableModel(); 
myTableModel.setColumnIdentifiers(new Object[]{"ID", "Name"}); 
JTable myTable = new JTable(myTableModel); 

// remember to save the references 
TableColumn myTableColumn0 = guiLoteryNumbersTable.getColumnModel().getColumn(0); 
TableColumn myTableColumn1 = guiLoteryNumbersTable.getColumnModel().getColumn(1); 
//... 

// remove temporary the column ("hide") 
myTable.getColumnModel().removeColumn(myTableColumn1); 

// then you restore that column when you need it ("show") 
myTable.getColumnModel().addColumn(myTableColumn1); 

這是我所知道的隱藏的列的最佳途徑。

+0

嘿傢伙,如果你不會說我的答案爲什麼是錯誤的,請不要對我負面評價。對另一個非常相似的問題發表了類似的答案,並且它被投了票。無論如何,我的方式很好,只是嘗試一下。 – august0490

+0

最有可能的結果是由於答案遲了3年。這可以很好,但不是當答案只是一個3歲的接受答案的詳細說明。 – GKFX