# JTable -> Rechtsklick -> Zeile markieren



## Caffè Latte (6. Mrz 2006)

Hi,

als Java-Anfänger habe ich mal ein kleines Programm geschrieben, mti dem ich eine Datenbanktabelle abfragen kann. Das Ergebnis der Abfrage wird in einem JTable angezeigt. Diese Tabelle verfügt über ein Popup-Menü mit Einträgen zum Bearbeiten und Löschen des markierten Datensatzes (also der Zeile).

Problem ist jedoch (für mich als Anfänger ), dass das nur funktioniert, wenn der Benutzer vorher eine Zeile markiert hat (mit einem Linksklick). Meine Frage ist nun:

wie schaffe ich es, dass ein Rechtsklick zuvor als Linksklick gewertet wird (also die Zeile markiert wird) und dann erst das Popup aufgeht. Ich habe noch keine Methode gefunden, die mir die Zeile unter derm Mauszeiger liefert.

Ich hoffe das war alles verständlich ... 

Caffè Latte


----------



## Illuvatar (6. Mrz 2006)

Mit dem Point aus dem MouseEvent kannst du über die JTable#rowAtPoint die Zeile erhalten und diese markieren.


----------



## Caffè Latte (6. Mrz 2006)

Hi.

Danke, die Zeile hätte ich schon mal. Nur wie markiere ich eine Zeile zur Laufzeit? 

Danke für die Geduld ... 

Caffè Latte


----------



## Illuvatar (6. Mrz 2006)

Du brauchst die Methode changeSelection.
Also sowas:


```
JTable myTable = ...;
MouseEvent event = ...;

myTable.changeSelection (myTable.rowAtPoint(event.getPoint()), myTable.columnAtPoint(event.getPoint()), false, false);
```


----------



## Caffè Latte (7. Mrz 2006)

Hi,

erstmal vielen Dank für deine Mühe und Geduld mit einem totalen Anfänger. Aber dieses Peanuts-Feature ist doch schwerer als ich dachte:

nachdem ich einen ActionListener für das Popup-Menü eingefügt habe, reagiert der MouseListener nicht mehr und somit gibt es auch keinen MouseEvent mehr. Ok dachte ich mir, meine Tabelle hat ja die getMousePosition Methode, die ja ebenfalls die Mausposition liefert. Also habe ich es damit versucht:


```
private void jMenuItemBearbeitenActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            int row = jTableErgebnis.getSelectedRow();
            if ( row < 0 ) {
                row = jTableErgebnis.rowAtPoint(jTableErgebnis.getMousePosition());
                jTableErgebnis.changeSelection(row, 0, false, false);
            }
            String id = (String) jTableErgebnis.getValueAt(row, 0);
            System.out.println(row + "|" + id);
            // ToDo: neuen Dialog zum Bearbeiten öffnen
        } catch( Exception exp) {
            errorDialog("Fehler: " + exp.toString());
        }
    }
```

Das funktioniert soweit auch, allerdings lässt die Genauigkeit etwas zu wünschen übrig (die ich allerdings mit dem MouseEvent nicht weiter nachgeprüft hatte). rowAtPoint liefert mir immer die Zeile ca. 2-3 Pixel unterhalb des Mauszeigers. Liegt der Fehler an meiner Implementierung oder ist das einfach so (was ich mir kaum vorstellen kann).

Caffè Latte


----------



## Caffè Latte (6. Apr 2006)

Hi,

diesen Thread hatte ich fast vergessen, aber das Problem ist gelöst.  Ich hatte das Kontextmenu über "componentPopupMenu" an die Tabelle gebunden. D.h., dass ich in die Ereignisbehandlung des Klicks erst dann kam, nachdem das Kontextmenü erschien. Kontextmenü erscheinen aber unterhalb des Mauszeigers; daraus resultierte letztendlich die Differenz. Da ich zuerst nur einen Eintrag im Kontextmenü hatte merkte ich dieses Verhalten erst zu spät.  Blöd, wenn man eben keine Ahnung hat ...

Ich habe jetzt eine Methode "showPopup" eingefügt:


```
private void showPopup(MouseEvent evt) {
        if (evt.isPopupTrigger()) {
           jTableErgebnis.changeSelection(jTableErgebnis.rowAtPoint(jTableErgebnis.getMousePosition()), 0, false, false);
            jPopupMenuErgebnisTabelle.show(evt.getComponent(),evt.getX(), evt.getY());
        }
    }
```

die von den Ereignisbehandlungen für mousePressed und mouseRelaesed aufgerufen wird (ich hatte gelesen, dass man beide Ereignisse abfragen sollte um plattformunabhängig zu sein).

Caffè Latte


----------

