2011-12-03 155 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