2009-09-29 2 views

Antwort

-4

Stellen Sie die Min-, Max- und „normal“ Breite auf 0:

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

Der zweite Ansatz ist TableColumnModel zu erweitern und alle Methoden außer Kraft setzen, die Illusion zu schaffen (für die JTable), dass Ihr Modell doesn‘ t haben diese zwei Spalten.

Wenn Sie also eine Spalte ausblenden, müssen Sie eine weniger zurückgeben, wenn die Tabelle nach der Anzahl der Spalten fragt. Wenn sie nach der Spalte X fragt, müssen Sie +1 zum Spaltenindex hinzufügen (abhängig davon, ob sie vorhanden ist) befindet sich links oder rechts neben der verdeckten Spalte) usw.

Lassen Sie Ihr neues Tabellenmodell alle Methodenaufrufe (mit den korrigierten Indizes usw.) an das tatsächliche Spaltenmodell weiterleiten und verwenden Sie das neue Tabellenmodell in der JTable.

+0

Nein, es funktioniert nicht. –

+0

Sie müssen auch die minimale und maximale Breite einstellen. –

+0

Warum die Reihenfolge ist wichtig, ich versuchte es zuerst und ich habe nicht die gleiche Reihenfolge, so dass es nicht funktioniert, oec ich die gleiche Reihenfolge (Breite, min, max) es funktioniert, also warum? –

-2

Sie könnten eine Unterklasse des Modells erstellen und TableModel.getColumnCount außer Kraft setzen, wie folgt:

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

Die letzten beiden Spalten dann in den JTable nicht angezeigt werden würden.

+0

aber kann ich die Daten von ihnen bekommen? –

+0

erstellen Sie nur die Illusion, dass die Spalten nicht da sind, aber die sind immer noch da und sollten daher in der Lage sein, die Daten noch – dharga

+0

zu bekommen Aber wie soll ich sie vor der GUI verstecken. –

54

Entfernen Sie die TableColumn aus der TableColumnModel.

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

Wenn Sie den Zugriff auf die Daten müssen dann verwenden Sie table.getModel().getValueAt(...).

Für eine komplexere Lösung, die es dem Benutzer ermöglicht, Spalten ein- und auszublenden, wie sie möchten, sehen Sie sich die Table Column Manager an.

+2

Dies ist der richtige Weg dies zu tun - die Breite auf 0 zu setzen ist eine Art Schwindel. Auf diese Weise haben Sie immer noch die Daten in Ihrem Modell; Sie verstecken nur einen Teil der Ansicht. – M1EK

+4

Auch mit dem obigen Ansatz sind die Daten immer noch im Modell, weshalb Sie wie oben gezeigt darauf zugreifen können. So funktioniert MVC. Wir ändern nur die Ansicht. Wenn Sie die Breite auf 0 setzen, versuchen Sie es mit der Tabulatortaste. Wenn Sie auf die ausgeblendete Spalte klicken, wird der Fokus so lange ausgeblendet, bis Sie erneut die Tabulatortaste drücken. Dies wird die Benutzer verwirren. – camickr

+0

vielen Dank.das half mir viel ......... – Geetanjali

12

Ich habe versucht 2 mögliche Lösungen, die beide funktionieren, aber ein Problem mit der 1. Lösung.

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

oder

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

In meinem letzten Fall, zog ich die zweite Lösung, weil ich ein TableRowSorter hinzugefügt.

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

Wenn table.removeColumn(table.getColumnModel().getColumn(4)) verwenden, es wird die Spalte aus der Ansicht/Tabelle physikalisch entfernen, so dass Sie nicht table.getValueAt(row, 4) verwenden - es gibt ArrayIndexOutOfBounds. Die einzige Möglichkeit, den Wert der entfernten Spalte zu erhalten, ist der Aufruf table.getModel().getValueAt(table.getSelectedRow(),4). Da TableRowSorter Sorten nur das, was auf dem Tisch ist, aber nicht die Daten in der DefaultTableModel Objekt, das Problem ist, wenn Sie den Wert nach Sortieren der Aufzeichnungen erhalten - es werden die Daten aus DefaultModelObject, abrufen, die nicht sortiert .

So habe ich die zweite Lösung verwendet dann table.getValueAt(table.getSelectedRow(),4);

Das einzige Problem, das ich mit dem zweiten Ansatz sehen durch @camickr erwähnt wurde: „Wenn Sie die Breite auf 0 gesetzt, versuchen Tabbing, wenn Sie das hidden hit Der Spaltenfokus verschwindet, bis Sie erneut auf die Registerkarte klicken. Das verwirrt die Benutzer. "

+6

Verwenden Sie 'table.getModel(). getValueAt (table.convertRowIndexToModel (row), 4). – xmedeko

-3

Ich habe sie alle ausprobiert: sie helfen nicht. Der beste Weg ist, ein neues Tabellenmodell ohne die Spalte zu erstellen, die Sie löschen möchten. Dies ist, wie Sie es tun:

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

zuerst die Spalte aus der

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

Dann rufen Sie die Daten aus der Modellansicht entfernen.

Eine Sache zu beachten ist, dass beim Abrufen der Daten, muss es aus Modell nicht aus der Tabelle abgerufen werden.

+0

Wie aus dem Modell entfernen? – partho

6

Ich hatte das gleiche Problem und wegen i TableColumnModelremovColumn(); bin mit mir does'not helfen, so habe ich diese

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

und funktionierte gut für mich es eine Spalte 0 verstecken und ich Wert noch in der Lage zu bekommen

Verwandte Themen