2011-12-03 15 views
11

Chcę dodać kilka kolumn do tabeli (Swing JTable). Niektóre z nich mają domyślny rozmiar (na przykład 250), inne będą ukryte (więc ich rozmiar będzie wynosił 0). Używam tego kodu:JTable ukryj i pokaż kolumny

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

problem jest wtedy, gdy wyświetlana jest tabela, wszystkie kolumny są pokazywane (brak jest ukryty), a ich wielkość nie jest 250, ale wszyscy mają ten sam rozmiar.

Jak uzyskać pożądany efekt?

+3

Proszę spojrzeć na odpowiedź Swing-genius StanislavL tutaj: [hide-column-in-jtable-temporary] (http://stackoverflow.com/questions/5270032/hide-column-in-jtable-temporary) –

+0

fajny link :) +1 – mprabhat

Odpowiedz

11

JTable#removeColumn usuń kolumny tylko z widzenia JTable, więcej w tym example

+1

dzięki, nie jest to idealne rozwiązanie, ponieważ brakuje mu uporządkowanej pozycji w przykładzie, ale naprawiłem. – Randomize

13

Chyba nazwali swoje metody nieprawidłowo, gdy chcesz ukryć kolumnę można ustawić

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

ale w kodzie robisz, gdy chcesz pokazać kolumnę, która jest dokładnie odwrotnie.

Również nie ma potrzeby wywoływania tej metody "setWidth" w TableColumn, przeczytaj TableColumn#setWidth(int).

7

zamiast ponownego wymyślania koła można rozważyć użycie JXTable (w the SwingX project), który wspiera ukryte kolumny, Kompletną z UI-kontroli w celu umożliwienia użytkownicy ukrywają/wyświetlają je dynamicznie - i mnóstwo innych przydatnych rzeczy :).

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

spróbuj to coś takiego na przykład:

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

To najlepszy sposób wiem, aby ukryć kolumnę.

+0

Hej, nie głosujcie na mnie negatywnie, jeśli nie powiecie, dlaczego moja odpowiedź jest błędna. Podobna odpowiedź na inne bardzo podobne pytanie i została przegłosowana. Mój sposób działa dobrze, po prostu spróbuj. – august0490

+0

Najprawdopodobniej przyczyną spadków były 3 letnie opóźnienia. To może być w porządku, ale nie wtedy, gdy odpowiedź jest tylko rozwinięciem przyjętej przez trzy lata odpowiedzi. – GKFX