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

nice link :) +1 – mprabhat

答えて

11

JTable#removeColumnできるようにUIコントロールとcomlete、もっとこのexample

+1

ありがとう、それは完璧な解決策ではありませんので、例の順序位置が間違っていますが、修正しました。 – Randomize

13

あなたが

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

を設定しますが、あなたは全く逆である列を表示したい場合、あなたのコードの中で、あなたがこれをやっている列を非表示にしたいとき、私は、あなたが誤ってあなたの方法を命名していると思います。

また、TableColumnのこの "setWidth"メソッドを呼び出す必要はありません。TableColumn#setWidth(int)を読んでください。

7

で代わりにあなたが非表示列をサポートしている(the SwingX project中)JXTableを使用することを検討するかもしれない再発明するホイールの、JTableのビューから列のみを削除ユーザーを動的に隠したり表示したりすることができます。

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