# JTable Spalte unsichtbar machen



## Doomrunner (16. Apr 2004)

Hi,

ich möchte gerne eine Spalte des JTables unsichtbar machen. Mit column.setMaxWidth(0); geht das aber zum Beispiel nicht. In der Doku habe ich auch keine entsprechende Methode dafür gefunden.

Geht das überhaupt?

thx


----------



## Mick (16. Apr 2004)

Am elegantesten geht sowas mit Deinem eigenen TableModel, wo Du die Methode getValueAt() überschreibst.
Such mal hier im Forum, da gibt es schon was zum TableModel.

Grüße,
Mick


----------



## Doomrunner (16. Apr 2004)

Habe ich schon gemacht:


```
public Object getValueAt(int rowIndex, int columnIndex) {
            if(columnIndex != 1) { return (Object)((Vector)data.elementAt(rowIndex)).elementAt(columnIndex); }
            else { return ""; }
        }
```

Aber so bekomme ich einfach nur ne leere Spalte ausgegeben. Bringt also leider nix.


----------



## Mick (16. Apr 2004)

Ich glaub, Du musst setValueAt auch überschreiben.
Willst Du die Column dauerhaft nicht anzeigen? Oder nur manchmal?

Wenn gar nicht, dann kannst Du das Feld ja ganz aus Deiner Table raushalten.

Grüße,
Mick


----------



## Doomrunner (16. Apr 2004)

Ich will sie dauerhaft unsichtbar lassen. In meiner Datenstruktur muss sie aber drin sein.

Der Grund ist, dass ich die Tabelle mit Inhalten einer SQL-Datenbank fülle. Da hat jede Zeile ja eine ID. Diese ID brauche ich dann, wenn eine Zeile der Tabelle angeklickt wird. Ansonsten soll sie aber verdeckt bleiben.


----------



## Doomrunner (16. Apr 2004)

Hier mal meine bisherige Tabellenstruktur:


```
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.*;

class tabellenstruktur extends AbstractTableModel {                                      
        private Vector columnNames = new Vector();
        private Vector data = new Vector();
        private Vector ids = new Vector();
        
        public void addColumn(Object Spalte) {
            columnNames.addElement(Spalte);
        }
        
        public void addElement(Vector Spalten, int id) {
            data.addElement(Spalten);
            ids.addElement(""+id);
        }
        
        public int getColumnCount() {
            return columnNames.size();
        }
        
        public String getColumnName(int column) {
            return (String)columnNames.elementAt(column);
        }
        
        public int getRowCount() {
            return data.size();
        }
        
        public Object getValueAt(int rowIndex, int columnIndex) {
            return (Object)((Vector)data.elementAt(rowIndex)).elementAt(columnIndex);
        }
        
        public int getidAt(int rowIndex) {
            return Integer.parseInt((String)ids.elementAt(rowIndex));
        }
}
```


----------



## Mick (16. Apr 2004)

Ahhh, immer diese doppelten Vectoren. Wenn bei Dir eine Zeile einem Datensatz in der Datenbank entspricht, warum machst Du dann nicht eine Klasse Datensatz mit den Feldern Deiner Datenbank.
Und in Deinem TableModel benutzt Du einen Vector aus Datensätzen.

Das sieht dann in etwas so aus:

rowData ist der Vector aus Datensätzen, TableRow der Datensatz.




```
/** return the value of specified cell */
    public Object getValueAt(int row, int col) {
        TableRow tableRow = (TableRow)rowData.elementAt(row);
        switch(col) {
            case 0: return tableRow.id;
            case 1: return tableRow.irgendwas;
            case 2: return tableRow.irgendwasanderes;

            default: {
                throw new IllegalArgumentException("bad column " + col);
            }
        }
    }

    /** set value at specified cell */
    public void setValueAt(Object value, int row, int column) {
        TableRow tableRow = (TableRow)rowData.elementAt(row);

        switch(column) {
            // ID
            case 0: tableRow.id = (String) value; break;
            case 1: tableRow.irgendwas = (String) value; break;
            case 2: tableRow.irgendwasanderes = (String) value; break;
        }

        // notify table that rows are updated
        this.fireTableRowsUpdated(row, row);
    }
```

Nur dass in Deinem Fall eben keine Column mit der ID angezeigt wird.

Immer ein bißchen mehr objektorientiert denken, dann wird auch der Code übersichtlicher und sprechender.


Grüße,
Mick


----------

