JTable Selektion feststellen

Biergamasda

Erfahrenes Mitglied
Hi Leute

Hab ein Problem :)

Hab ne JTable mit nem TableModel, jetzt möchte ich gerne 1. festlegen, dass immer nur eine Zeile selektiert werden kann, und 2. möchte ich (in einem anderen TableModel) gerne wissen, wenn eine Zeile selektiert bzw angeklickt wurde.

Gibts da ne Möglichkeit oder nicht?

MFG me

PS:
Dachte da an sowas wie "selectionListener" hab aber nix gefunden *hehe*
 
Moin!
Jede JTable besitzt ein ListSelectionModel. http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/DefaultListSelectionModel.html

Diesem kannst du einen ListSelectionListener zuweisen und damit auf Selektionsänderungen reagieren.
Wenn du auf das einfache "anklicken" reagieren willst, benötigst du stattdessen einen MouseListener

Dem ListSelectionModel kannst du überdies über den SelectionMode zuweisen, das nur eine Zeile markeirt werden darf (SINGLE SELECTION) Dann musst du allerdings noch
JTable.setRowSelectionAllowed(true) aufrufen, damit auch die ganze Zeile markiert wird, und nicht nur eine Zelle..

*grüssle*
MeinerEiner
 
ich hab das jetz mal probiert...

Nun, funktioniert an sich ja mal nicht so schlecht, nur gibts noch etwas das nicht so ganz funktioniert wie ich mir das vorstelle...

Gleichmal vorweg Codeausschnitte

Das Anlegen der Tabelle
Java:
JTable tWerkzeugKalkulation = new JTable(model);            
            tWerkzeugKalkulation.addMouseListener(new WerkzeugKalkContextMenu("Werkzeugkalkulation",tWerkzeugKalkulation));
            tWerkzeugKalkulation.setDefaultRenderer(Object.class, new CustomCellRenderer());
            tWerkzeugKalkulation.setRowSelectionAllowed(true);
            JScrollPane spWerkzeugKalk = new JScrollPane(tWerkzeugKalkulation);
            spWerkzeugKalk.setPreferredSize(tWerkzeugKalkulation.getPreferredSize());


Das setzen des Listeners
Java:
listSelModel = tWerkzeugKalkulation.getSelectionModel();
            listSelModel.addListSelectionListener(new SharedListSelectionHandler((WerkzeugKalkModel)tWerkzeugKalkulation.getModel(), (ZuordnungsModel)tZuordnungen.getModel()));

Der Listener/Handler himself
Java:
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class SharedListSelectionHandler implements ListSelectionListener {
    
    private WerkzeugKalkModel model;
    private ZuordnungsModel zModel;
    
    public SharedListSelectionHandler(WerkzeugKalkModel model, ZuordnungsModel zModel) {
        this.model = model;
        this.zModel = zModel;
    }

    public void valueChanged(ListSelectionEvent e) {        
        ListSelectionModel lsm = (ListSelectionModel)e.getSource();
        lsm.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                                
        int index = e.getFirstIndex();
        boolean isAdjusting = e.getValueIsAdjusting();
        if (!isAdjusting) {
            System.out.println(index + " -- " + e.getLastIndex());
            zModel.setValues(model.getIdFromRow(index));
        }        
    }
}


2 Zeilen sind vorhanden, bei abwechselndem klicken auf die Zeilen (Zeile0 -> Zeile1 -> Zeile0 -> Zeile1...) bekomme ich folgende Ausgabe:

0 -- 0
0 -- 1
0 -- 1
0 -- 1
0 -- 1



Jetzt würde ich gerne wissen, wie ich feststellen kann welche Zeile nun wirklich selektiert wurde, bzw was ich machen muss um die aktuell selektierte Zeile zu finden.

Vielen Dank schon mal im Voraus
 
Moin!
Zunächst einmal, musst du nocht jedesmal, wenn due valueChanged Methode aufgerufen wird, den

SelectionMode von deinem SelectionModel setzen. Das reicht einmal, am besten dann wenn du

deinen Tabelle erstellst.
Wie ich schon gesagt habe, reagiert der ListSelectionListener immer dann, wenn sich die

Selektion geandert hat.
Ich hatte dir ja schon den MouseListener vorgeschlagen, wenn du aufs reine anklicken

reagieren willst. Musst du dir vielleicht nochmal ueberlegen, ob der nicht besser deinen

Anforderungen entspricht.

Jedenfalls, wenn du die aktuell selekierte Zeile erhalten willst, bekommst du die mit
Code:
table.getSelectedRow();
Das hättest du aber auch einfach in der Java Doku nachlesen können..


*grüssle*
MeinerEiner
 
Zurück