# JTable SelectionListener



## maximilian1 (27. Jun 2011)

Hallo ich verzweifle gerade daran, dass der selection Listerner mir immer nur firstIndex und lastIndex ausgibt. Ich möchte aber generell immer nur ein element meiner JTable auswählen und möchte dann das selektierte Element/Index bekommen.
-Kann ich eine Mehrfachauswahl sperren,
-wie bekomme ich den index des gewählten Elements?
danke im Vorraus


----------



## SlaterB (28. Jun 2011)

'jtable single selection' sollte eine passende Suche sein, 
und wenn immer nur ein Zeile selektiert wird dürfte der Index doch passen


----------



## maximilian1 (28. Jun 2011)

ne der Index passt leider nicht. Der gibt mir auch immer unterschiedliche Werte für getFirstIndex() und getLastIndex() zurück, jenachdem wo ich gerade hinklicke ist zum Beispiel FirstIndex richtig und LastIndex falsch und umgekehrt auch wenn ich jetzt singleSelection ausgewählt habe.


----------



## SlaterB (28. Jun 2011)

ein Beispielprogramm wäre nicht schlecht, mit Bedienungsanweisung und Protokollierung der Ergebnisse,
Sortierung spielt keine Rolle, oder?
du verwechselst auch nicht Row/ Column?
evtl. kommen mehrere Events, erst zum Deselektieren der alten Zeile dann für neue Selektion,
bzw. erst wird einer der Indexe geupdatet, dann der nächste?

oder gibts komplett scheinbar zufällige Ergebnisse? zumindest reproduzierbar bei jedem neuen Versuch mit gleicher Klickreihenfolge?


----------



## maximilian1 (28. Jun 2011)

Hier mal ein Beispielprogramm mit meinem Problem. Die indizes firstIndex und lastIndex werden auf der Konsole ausgegeben. Code kann direckt in Eclipse kopiert und ausgeführt werden.

[JAVA=42]package testing;

import java.awt.Container;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Testing implements ListSelectionListener {

	Testing(){
		JFrame mainFrame = new JFrame("Test");
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setMinimumSize( new Dimension(700, 100) );

		Container contentPanel = mainFrame.getContentPane();
		contentPanel.setLayout(new BoxLayout(contentPanel,BoxLayout.Y_AXIS));

		//Spaltenbeschriftung
		String[] columnNames = {"Text1",
								"Text2",
								};

		//Daten für die Tabelle in Array ablegen
		Object[][] data = new Object[4][2];
		data[0][0] = "bla1";
		data[1][0] = "bla2";
		data[2][0] = "bla2";
		data[3][0] = "bla3";
		data[0][1] = "club1";
		data[1][1] = "club2";
		data[2][1] = "club3";
		data[3][1] = "club4";

		//Tabelle Erzeugen
		JTable table = new JTable(data, columnNames);
		JScrollPane scrollPane = new JScrollPane(table);

		table.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
		table.getSelectionModel().addListSelectionListener( this );

		contentPanel.add( scrollPane );

		mainFrame.pack();
		mainFrame.setVisible(true);
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Testing window = new Testing();
			}
		});
	}

	@Override
	public void valueChanged(ListSelectionEvent arg0) {
		System.out.println("firstIndex: " + arg0.getFirstIndex() + " , " + "lastIndex: " +  arg0.getLastIndex() );		
	}

}
[/code]

Man sieht wie gesagt, das er die Indizes wohl zwischenspeichert außerdem ruft er valueChanged() immer doppelt auf


----------



## SlaterB (28. Jun 2011)

ok, eigentlich sollte ich das kennen, gibts ja oft genug,
ich behaupte jetzt mal die Werte im ValueChanged bedeuten nicht genau die aktuell selektierten Indexe, 
sondern beschreiben den Bereich in dem sich etwas getan hat, wo z.B. überall die Tabelle neu gezeichnet werden muss,

nutze dann eben folgenden Code:

```
ListSelectionModel m = (ListSelectionModel)arg0.getSource();
        System.out.println(m.getMinSelectionIndex() + ", " + m.getMaxSelectionIndex());

oder
        JTable t = ..;
        t.getSelectedRow();
```


----------



## Dit_ (29. Jun 2011)

Ich benutze ebenfalls JTable.getSelectedRow(..) Methode in solchen Fällen.

```
@Override
        public void valueChanged(ListSelectionEvent e) {
            if(!e.getValueIsAdjusting()) {
                JTable table = (JTable)e.getSource();
                int row = table.getSelectedRow();
                System.out.println(row);
            }
        }
```


----------



## SlaterB (29. Jun 2011)

hmm, ich hatte meins kurz ausprobiert, 
entweder ist  ListSelectionModel die Source oder die JTable, beides geht doch kaum 

ok, hängt sicher davon ab wo man den Listener added, im Beispiel hier beim SelectionModel


----------

