2009-09-29 13 views

Odpowiedz

-4

Ustaw min, max i „normalne” width do 0:

jTable.getColumn("ABC").setWidth(0); 
jTable.getColumn("ABC").setMinWidth(0); 
jTable.getColumn("ABC").setMaxWidth(0); 

Drugie podejście jest rozszerzenie TableColumnModel i zastępują wszelkie metody, aby stworzyć iluzję (dla JTable), że dany model nie robi” t mają te dwie kolumny.

Kiedy więc ukryjesz kolumnę, powinieneś zwrócić mniej, gdy w tabeli pojawi się liczba kolumn, a kiedy prosi o kolumnę X, możesz dodać +1 do indeksu kolumny (w zależności od tego, czy znajduje się po lewej lub prawej stronie ukrytej kolumny) itp.

Pozwól swojemu nowemu modelowi tabeli przesyłać dalej wszystkie wywołania metod (z poprawionymi indeksami itp.) do rzeczywistego modelu kolumny i użyj nowego modelu tabeli w tabeli JTable.

+0

Nie, to nie działa. –

+0

Należy również ustawić min i max width. –

+0

Dlaczego zamówienie jest ważne, próbowałem go najpierw i nie używałem tej samej kolejności, więc nie działa, oec użyłem tej samej kolejności (szerokość, min, max) to działa, więc DLACZEGO? –

-2

Można by utworzyć podklasę modelu i zastąpić TableModel.getColumnCount następująco:

int getColumnCount() { 
    return super.getColumnCount()-2; 
} 

Ostatnie dwie kolumny nie będzie wówczas wyświetlany w JTable.

+0

, ale czy mogę pobrać z nich dane? –

+0

tworzysz tylko iluzję, że nie ma tam kolumn, ale są one nadal tam, a zatem powinny być w stanie uzyskać dane nadal – dharga

+0

Ale jak mam je ukryć przed GUI. –

54

Usuń TableColumn z TableColumnModel.

TableColumnModel tcm = table.getColumnModel(); 
tcm.removeColumn(tcm.getColumn(...)); 

Jeśli potrzebujesz dostępu do danych, użyj table.getModel().getValueAt(...).

Dla bardziej złożonego rozwiązania, które pozwala użytkownikowi ukryć/pokazać kolumny, jak chcą, sprawdzić Table Column Manager.

+2

To jest prawdziwa odpowiednia metoda - ustawienie szerokości na 0 jest fałszywe. W ten sposób nadal masz dane w swoim modelu; po prostu ukrywasz część widoku. – M1EK

+4

Nawet przy powyższym podejściu dane nadal znajdują się w modelu, dlatego można uzyskać do niego dostęp, jak pokazano powyżej. Tak działa MVC. Wszystko, co robimy, to zmiana widoku. Po ustawieniu szerokości na 0, spróbuj tabbować, gdy klikniesz na ukryty słup kolumny, zniknie, dopóki ponownie nie klikniesz. To zmyli użytkowników. – camickr

+0

dziękuję bardzo. Pomogło mi to ......... – Geetanjali

12

Próbowałem 2 możliwych rozwiązań, które działają, ale dostałem problem z pierwszym rozwiązaniem.

table.removeColumn(table.getColumnModel().getColumn(4)); 

lub

table.getColumnModel().getColumn(4).setMinWidth(0); 
    table.getColumnModel().getColumn(4).setMaxWidth(0); 
    table.getColumnModel().getColumn(4).setWidth(0); 

W niedawnej przypadku, 2nd korzystne rozwiązanie, ponieważ dodano TableRowSorter.

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
    table.setRowSorter(sorter); 

Podczas korzystania table.removeColumn(table.getColumnModel().getColumn(4)) będzie fizycznie usunąć kolumnę z tabeli/widoku, więc nie można użyć table.getValueAt(row, 4) - zwraca ArrayIndexOutOfBounds. Jedynym sposobem uzyskania wartości usuniętej kolumny jest wywołanie table.getModel().getValueAt(table.getSelectedRow(),4). Od TableRowSorter sortuje tylko to, co na stole, ale nie dane w DefaultTableModel obiektu, problem jest, gdy pojawi się wartość po sortowania rekordów - będzie pobierać dane z DefaultModelObject, która nie jest posortowana .

Więc użyłem 2. Roztwór następnie wykorzystywane table.getValueAt(table.getSelectedRow(),4);

Jedyny problem widzę z 2nd podejście zostało wymienione przez @camickr: „Kiedy ustawić szerokość 0, spróbuj tabulatorem, gdy trafisz ukryty Kolumna fokusu znika, dopóki nie pojawi się ponownie. To spowoduje dezorientację użytkowników. "

+6

Użyj 'table.getModel(). getValueAt (table.convertRowIndexToModel (row), 4). – xmedeko

-3

Próbowałem ich wszystkich: oni nie pomagają. NAJLEPSZY sposób polega na stworzeniu nowego modelu tabeli bez kolumny, którą chcesz usunąć. Oto jak to zrobić:

table = (DefaultTableModel) <table name>.getModel(); 
DefaultTableModel table1 = new DefaultTableModel(); 
Vector v = table.getDataVector(); 
Vector v1 = newvector(v,<column index you want to delete>); 

Vector newvector(Vector v,int j){ 
    Vector v1= new Vector(); 
    try{ 
     Vector v2; 
     Object[] o = v.toArray(); 
     int i =0; 
     while(i<o.length){ 
      v2 = (Vector) o[i]; 
      v2.remove(j); 
      v1.add(v2); 
      i++; 
     } 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null,"Error in newvector \n"+e); 
    } 
    return v1; 
} 

Vector getColumnIdentifiers(int i) { 
    Vector columnIdentifiers = new Vector(); 
    int j=0; 
    while(j<i){ 
     columnIdentifiers.add(("c"+(j+1))); 
     j++; 
    } 
    return columnIdentifiers; 
} 
table1.setDataVector(v1,getColumnIdentifiers((<column count>-1))); 
<table name>.setModel(table1); 
28

Najpierw usunąć kolumnę z widoku

table.removeColumn(table.getColumnModel().getColumn(4)); 

Następnie odzyskać dane z modelu.

Należy zwrócić uwagę, że podczas pobierania danych należy je pobrać z modelu, a nie z tabeli.

+0

Jak usunąć z modelu? – partho

6

miałem ten sam problem i dlatego używam TableColumnModelremovColumn(); does'not mi pomóc więc użyłem tego

table.getColumnModel().getColumn(0).setWidth(0); 
table.getColumnModel().getColumn(0).setMinWidth(0); 
table.getColumnModel().getColumn(0).setMaxWidth(0); 

i pracował w porządku dla mnie to ukryć kolumnę 0 i nadal w stanie uzyskać wartość od tego