JTable SelectionListener

maximilian1

Mitglied
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
 
Zuletzt bearbeitet von einem Moderator:
'jtable single selection' sollte eine passende Suche sein,
und wenn immer nur ein Zeile selektiert wird dürfte der Index doch passen
 
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.
 
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?
 
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
 
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:
Java:
        ListSelectionModel m = (ListSelectionModel)arg0.getSource();
        System.out.println(m.getMinSelectionIndex() + ", " + m.getMaxSelectionIndex());

oder
        JTable t = ..;
        t.getSelectedRow();
 
Ich benutze ebenfalls JTable.getSelectedRow(..) Methode in solchen Fällen.
Java:
        @Override
        public void valueChanged(ListSelectionEvent e) {
            if(!e.getValueIsAdjusting()) {
                JTable table = (JTable)e.getSource();
                int row = table.getSelectedRow();
                System.out.println(row);
            }
        }
 
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
 

Zurück
Oben