# Tabellen Überschriften ändern -setColumnIdentifiers()- Fehler



## acdc (3. Jan 2010)

Hallo, 
ich habe hier folgendes Programm, welches die Header der Tabelle ändern soll:


```
package deskapp1;

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;

  class HeaderSelector extends MouseAdapter
  {
    OwnTableModel tableModel;
    Vector newData;

    public HeaderSelector(OwnTableModel tModel)
    {
      tableModel = tModel;
      newData=new Vector();

    }
    public void mousePressed(MouseEvent e)
    {
      if(e.getButton()==MouseEvent.BUTTON3)  //nur wenn die rechte Maustaste gedrückt wird
      {
        JTableHeader th = (JTableHeader)e.getSource();
        Point p = e.getPoint();
        int col = getColumn(th, p);
                      
        InputDialog input=new InputDialog();
        input.viewDialog();

        if(input.getValue())
        {       
          newData=tableModel.getColumnIdentifiers(); //Eigene Methode in OwnTableModel "return columnIdentifiers"
          newData.insertElementAt(input.getText(),col); // neuer Text aus eigenem Dialog
          newData.remove(col+1);
          tableModel.setColumnIdentifiers(newData);
       }
      }
    }

    private int getColumn(JTableHeader th, Point p)
    {
      TableColumnModel model = th.getColumnModel();
        for(int col = 0; col < model.getColumnCount(); col++)
          if(th.getHeaderRect(col).contains(p))
            return col;
        return -1;
    }
  
  }

Aufruf:

    Tabelle1.setModel(modelT1);
    Tabelle1.getTableHeader().addMouseListener(new HeaderSelector(modelT1));
```

Das Problem ist nun, wenn ich mit der Rechen Maustaste auf einen SpaltenKopf klicke, kommt der Dialog und ich gebe einen neuen Namen ein. nach dem Klick auf ok kommt die exeption:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
        at java.util.Vector.elementAt(Vector.java:430)
        at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
        at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(BasicTableHeaderUI.java:654)
        at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderUI.java:670)
..usw

das Ganze funktioniert aber, wenn ich den Aufruf so gestalte:

```
Tabelle1.addMouseListener(new HeaderSelector(modelT1));
```
nur muss man hier mit der Maus auf die Spalte klicken und nicht auf die Überschrift.
Außderdem funktioniert der Typcast in 

```
JTableHeader th = (JTableHeader)e.getSource();
```
nicht mehr.

Hat jemand eine Idee wie ich das Problem beheben kann, bzw. gibt es eine bessere Möglichkeit die Tabellenüberschrift per Mausklick zu ändern?
(aber nicht nur die daten von der Klasse JTabel, sondern wirklich das model)

vielen Danke für eure Antworten und ich hoffe ich habe alle relevanten infos hier gepostet!


----------



## Michael... (4. Jan 2010)

Vermutlich liefert Dir Deine Methode getColumn(JTableHeader th, Point p) als Ergebnis -1.

JTableHeader bietet bereits eine Methode zum bestimmen der Tabellenspalte (s. API-Doku):
JTableHeader.columnAtPoint(java.awt.Point) Also warum das Rad neu erfinden?


----------



## André Uhres (4. Jan 2010)

Ganz allgemein würde ich sagen, dass die Spaltenüberschrift mit setHeaderValue geändert werden sollte:

```
table.getColumnModel().getColumn(columnIndex).setHeaderValue(..)
```


----------



## acdc (4. Jan 2010)

Danke für eure Antworten, die Funktion getColumn(..) hat keinen Fehler produziert - habe aber trotzdem deine (Michael) Lösung eingefügt.

@Andrè Uhres: 
Ich habe bereits das Spaltenumbenennen mit

```
table.getColumnModel().getColumn(columnIndex).setHeaderValue(..)
```
probiert. Da funktioniert es auch, aber wird da nur der Value und nicht der Name verändert. D.h., dass der Wert im DefaultTableModel nicht verändert wird und es daher nur eine oberflächliche Änderung ist. Ich muss aber die Überschriften im TableModel ändern., da ich dieses für andere Programmteile verwenden möchte.

Leider habe ich nocht keine Lösung gefunden - hoffe, dass mir jemand helfen kann!

danke


----------



## André Uhres (4. Jan 2010)

Das Problem kommt ja offensichtlich durch diese Zeile:
tableModel.setColumnIdentifiers(newData); 

Dann brauchst du die ja nur durch sowas zu ersetzen:
th.getColumnModel().getColumn(col).setHeaderValue(input.getText());


----------



## acdc (5. Jan 2010)

@André Uhres

das ist schon richtig, aber damit wird die Überschrift nur optisch verändert und nicht die Daten, die dahinter stehen. Die Daten werden nämlich im DefaultTableModel gespeichert.

...Mal sehen was ich noch probieren kann.

danke


----------



## André Uhres (6. Jan 2010)

acdc hat gesagt.:


> Die Daten werden nämlich im DefaultTableModel gespeichert.


Ich weiss, aber die wurden ja bereits aktualisiert. Lass einfach die Zeilen darüber unverändert stehen:

```
newData=tableModel.getColumnIdentifiers(); //Eigene Methode in OwnTableModel "return columnIdentifiers"
newData.insertElementAt(input.getText(),col); // neuer Text aus eigenem Dialog
newData.remove(col+1);
```
Damit ist dein DefaultTableModel aktualisiert, auch *ohne* setColumnIdentifiers.


----------



## acdc (6. Jan 2010)

Danke Danke - auf das wär ich wahrscheinlich nie gekommen!

Es funktioniert jetzt!!
Welch FREUDE


----------

