# JLIST/rechtsklick/PopUpMenu



## LenDer (25. Mai 2010)

Guten Morgen,

ich hätte da mal eine Frage

Also ich habe eine JLIST mit Werten, diese einzelene Werte soll man anklicken können(rechtsklick) und dann soll ein PopUpMenu erscheinen. Wenn man auf ubertragen klickt soll dieser Wert ausgelesen werden und in eine andere JLIST übertragen werden, meine Frage wäre wie prüfe ich ein Rechtsklick und wie geht das genau mit dem menu

Mit dem Menu hab ich diesen Codeschnipsel gefunden

```
JPopupMenu popmenu = new JPopupMenu();
                 JMenuItem item1 = new JMenuItem("");
                 JMenuItem item2 = new JMenuItem("");
                 JMenuItem item3 = new JMenuItem("");
                 JMenuItem item4 = new JMenuItem("");
                 popmenu.add(item1);
                 popmenu.add(item2);
                 popmenu.add(item3);
                 popmenu.add(item4);
                 popmenu.show( evt.getComponent(), evt.getX(), evt.getY() );
```


meiner JLIST habe ich einen jL_filialen1MouseClicked hinzugefügt.


Danke für die freundliche hilfe


----------



## KrokoDiehl (25. Mai 2010)

Moin.
Eine Recht schnelle Art, einer (Swing-)Komponente ein Kontextmenü zu geben, ist über die Methode

```
setComponentPopupMenu()
```
.
Bei _JList _und _JTable _habe ich manchmal aber das "Problem", dass beim Rechtsklick zwar ein Kontextmenü aufgeht, aber sich nicht die Selektion ändert. Das ist dann so eine Sache, wie man dies für den Benutzer haben will.
Für den Anfang würde ich mal mit 
	
	
	
	





```
setComponentPopupMenu()
```
 arbeiten und mich der Herausforderung widmen, wie man auf einen Eintrag im Popupmenü reagiert 

Mit deinem geposteten Code bekommst du zwar ein Popupmenü, aber das hat nur vier leere Einträge 
In jedem Fall brauchst du einen _ActionListener _für die Menüeinträge, welcher bestimmt was getan wird, wenn dieser Menüpunkt ausgelöst wird.


----------



## LENDER (25. Mai 2010)

ok klappt alles soweit, aber wie nur zum Teufel, kann ich bevor er das Popupmenu öffnet, den Index von der Jlist makieren .. also auf wert2 wird ein rechtsklick gemacht, jezze soll wert2 auch makiert werden, also damit ich getseleceted machen kann...


----------



## Gast2 (25. Mai 2010)

Brauchst ein PopupListener, hab ich jetzt mal nicht getestet musst selber mal ausprobierne und eventuell noch rumschrauben...


```
public class ListPopupMenuAdapter implements PopupMenuListener {
    private void maybeUpdateSelection(PopupMenuEvent e) {
        final AWTEvent awtEvent = EventQueue.getCurrentEvent();
        final MouseEvent me;
        if (!(awtEvent instanceof MouseEvent)
                || !(me = (MouseEvent) awtEvent).isPopupTrigger()) {
            return;
        }
        final JPopupMenu menu = (JPopupMenu) e.getSource();
        final Component invoker = menu.getInvoker();

        if (!(invoker instanceof JList)) {
            return;
        }
        final JList list = (JList) invoker;
        final Point p = me.getPoint();
        final int row = list.locationToIndex(p);
        if (row == -1) {
            return;
        }
   
        // Ab hier wie bei Windows eventuell MAC und Linux anpassen
        int [] indices = list.getSelectedIndices();
        int rowSelected = Arrays.binarySearch(indices, row);
        if(rowSelected < 0){
        	list.clearSelection();
        	list.setSelectedIndices(indices);
        }
    }


    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
        maybeUpdateSelection(e);
    }

    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        maybeUpdateSelection(e);
    }

    public void popupMenuCanceled(PopupMenuEvent e) {
        maybeUpdateSelection(e);
    }
}
```


----------



## KrokoDiehl (25. Mai 2010)

Ich habe es ansonsten mal mit einem MouseListener an der _JList _(oder wo auch immer) gemacht und in 
	
	
	
	





```
mousePressed()
```
 beim Rechtsklick die Selektion gesetzt.
Das geht meistens auch, allerdings nicht wenn das Popupmenü bereits sichtbar ist, und man via Rechtsklick woanders in die Liste klickt. Dann geht das Popup zwar an der neuen Stelle auf, aber die Selektion bleibt. Höchstwahrscheinlich weil der Klick nicht zur _JList _kommt.
_SirWayne_'s Vorschlag klingt daher interessant (...heut abend selbst mal ausprobiern  )


----------



## Gast2 (25. Mai 2010)

Ja hab so ein Listener für die JTable damit man wenigstens ein bischen die Selektion platformunabhängig machen kann.


----------



## KrokoDiehl (26. Mai 2010)

Läuft ziemlich gut. Darf ich fragen wieso das auch bei den Methoden 
	
	
	
	





```
popupMenuCanceled()
```
 und 
	
	
	
	





```
popupMenuWillBecome[B]In[/B]visible()
```
gemacht wird? Meines Erachtens macht es nur bei 
	
	
	
	





```
popupMenuWillBecomeVisible()
```
 Sinn.


----------



## Gast2 (26. Mai 2010)

Wegen Mac und Linux! Da ist ist e.isPopUpTrigger() in unterschiedlichne methoden gesetzt...


----------

