# JTable - getSelectedRow nach sort



## Guest (30. Mai 2007)

Hallo,
habe ein Problem mit einer JTable. Und zwar lese ich aus einer Arraylist Objektdaten in die JTable ein und benutze nach der Auswahl getSelectedRow als Index um auf das entsprechende Object in der Arraylist zuzugreifen. 

Nun habe ich den Befehl

```
table.setAutoCreateRowSorter(true);
```

auf die Tabelle angewandt, damit ich nach Spalten sortieren kann. Wenn ich nun aber nach einer Spalte sortiere und dann getSelectedRow verwende um auf meine Arraylst zuzugreifen, wird dort natürlich das Falsche Element ausgewählt.

Kann ich die JTable irgendwie so einstellen, dass beim Sortieren über die Spalten die Zeilennummern mit verschoben werden?


----------



## Gast (30. Mai 2007)

Verwende übrigens das DefaultTableModel, falls das hilft.


----------



## MasterEvil (30. Mai 2007)

Das ist aber nicht besonders sinnvoll!
Du solltest jeder Zeile auch eine eindeutige ID mitgeben, diese kanst du ja in die erste Spalte packen und die Spalte selbst machst du dann ganz einfach nicht sichtbar.
So kannst du dann auch nach dem sortieren wieder die richtige Zeile selektieren.


----------



## Gast (30. Mai 2007)

hmm wie kann ich so ein unsichtbares Feld erzeugen? 

Wenn ich also einen Primärschlüssel in der ersten Spalte habe, der eine Zeile eindeutig identifiziert, dann würde ich mit 


```
table.getValueAt(table.getSelectedRow(), 0)
```

den Wert des PKs auslesen und damit dann in meiner ArrayList das passende Objekt suchen, wär das so richitg?


----------



## DStrohma (30. Aug 2009)

ich habe das gleiche problem und finde einfach keine lösung...

hier ein beispiel:

```
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class ShowTable extends JFrame {
	
	private final String[] colName = {"Item", "Bild", "Name", "Kategorie", "Beschreibung"};
	private Object[][] tableData = null;
	private DefaultTableModel tableModel;
	private JTable table;
	private JScrollPane scrollPane;
	
	public ShowTable() {		
		
		initData();
		initTable();
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.pack();
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	private void initData() {
		tableData = new Object[10][5];
		for(int i=0; i<10; i++) {
			for(int ii=0; ii<5; ii++) {
				tableData[i][ii] = i + " data " + ii;
			}
		}
	}
	
	private void initTable() {
		tableModel = new DefaultTableModel(tableData, colName);
		table = new JTable(tableModel);
		table.setAutoCreateRowSorter(true);
		scrollPane = new JScrollPane(table);
		this.add(scrollPane);
		table.addMouseListener(new MouseListener() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				System.out.println(tableModel.getValueAt(table.getSelectedRow(), 0));
			}
			@Override
			public void mouseEntered(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}
			@Override
			public void mouseExited(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}
			@Override
			public void mousePressed(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}
			@Override
			public void mouseReleased(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}
		});
	}
	
	public static void main(String[] args) {
		new ShowTable();
	}
}
```

versucht einfach mal auf eine zelle zu klicken, dann bekommt ihr den wert der selektierten zeile und erste spalte. aber wenn ihr jetzt auf einen spalten-header klickt, dann gerät das ganze durcheinander... damit hab ich nicht gerechnet, ich dachte der findet dann immer noch die passende erste spalte zu der selektierten zeile :shock:

muss ich irgendwas erst aktualisieren bevor ich mir mit dem mouselistener was aus der tabelle hole? oder wie geht das sonst?

danke im voraus,
DS


----------



## hdi (30. Aug 2009)

Du brauchst die Funktion


```
table.convertRowIndexToModel(table.getSelectedRow())
```

Das gibt dir dann den Index der tatsächlichen Daten in deiner Datenstruktur.
Denn wenn ein Objekt in der Liste an Stelle #23 steht, kann es trotzdem in deinem 2d-array an stellt #4 liegen oder sonst was. Beim Sortieren wird nämlich nur die Anzeige geändert, es wird nix in den Daten verschoben.

Allerdings weiss ich nicht ob das auch funktioniert mit einem normalen 2d-Array, wie du es hast. Evtl benötigt man dafür ein "richtiges" TableModel. Aber versuch das einfach mal.


----------



## DStrohma (30. Aug 2009)

O! M! G!

das geht    vielen dank! da wär ich jetzt sonst noch ewigkeiten dran gesessen...

PS: hab ein eigenes tablemodel. weis nicht obs ohne geht.


----------

