MenuItems dynamisch

Mein Problem:
Ich habe eine Liste mit vielen Items darin. Nun will ich ein Popupmenu für die einzelnen Elemente in der Liste erstellen. Klicke ich mit der rechten Maustaste auf ein Items in der Liste soll ein Popupmenu erscheinen mit speziellen Daten aus der DB.
Jedes Item aus der Liste hat verschiedene Daten in der DB. Deshalb benötige ich ein Popupmenu der dynamisch die MenuItems erstellt. Ein Popupmenu mit einem Item “ausgewähltes Element lösche” habe ich schon erstellt. Wie bekomme ich jetzt dynamisch die Daten aus der DB als Items in das Popupmenu…

Hat jemand ein paar Tipps?

Danke.

item.add(new Item)
PopUp.add(item.get(i) = new JMenuItem(liste.get(i).getInfo()));		
}```

so was in der Art? evtl. stimmt der Code nicht 100% bin, naja sagen wir, nciht fit  in Java

Wie erstellst du das Menü, bzw. wann?

Klasse View


...
// Context-Menu in Anlagenliste
final Menu menu = new Menu(this.client);
this.listAnlagen.setMenu(menu);
menu.addListener(SWT.Show, new ContextMenu(menu, this.listAnlagen));
....

Klasse ContextMenu


...
@Override
    public void handleEvent(Event event)
    {
	
	MenuItem[] menuItems = this.menu.getItems();
	for (int i = 0; i < menuItems.length; i++)
	{
	    menuItems**.dispose();
	}
	String[] listItems = this.listAnlagen.getSelection();
	for (int i = 0; i < listItems.length; i++)
	{
	    MenuItem removeSelection = new MenuItem(this.menu, SWT.PUSH);
	    removeSelection.setText(listItems** + " aus Auswahl entfernen"); //$NON-NLS-1$
	    removeSelection.addListener(SWT.Selection, new Listener()
	    {
		@Override
		public void handleEvent(Event events)
		{
		    ContextMenu.this.listAnlagen.remove(ContextMenu.this.listAnlagen.getSelectionIndices());

		}
	    });
	}
    }
...

Hmmm… wenn ich nimdas Beispiel anschaue komme ich auf die Idee eine Schleife zu erstellen der für das ausgewählte Item in der Liste alle Daten aus der DB lädt und in das Menu einfügt.
Aber für alle Daten brauche ich ja ein MenuItem, d.h. ich muss für alle Daten jeweils ein MenuItem erstellen?

Also erstmal halte ich deine Vorgehensweise für recht kompliziert.
Sinnvoller ist es IMO den MenuDetectListener zu verwenden und dort das ContextMenü explizit zu erzeugen

Beispiel:

list.addMenuDetectListener(new MenuDetectListener() {
	@Override
	public void menuDetected(MenuDetectEvent e) {
		Menu menu = new Menu(list.getShell(), SWT.POP_UP);
		// Creates a new menu item 
		MenuItem exit = new MenuItem(menu, SWT.NONE);
		exit.setText("Test!");
	        exit.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				System.out.println("Test");
			}
		});
		// We need to make the menu visible
		menu.setVisible(true);
       }
});

Vorteil dieser Vorgehensweise ist, dass das Menü jedes mal neu erzeugt wird. Du musst die alten Menuitems also nicht extra disposen und kannst jedes mal context bezogene Informationen abrufen und einbinden. In deinem Fall würde das also bedeuten, dass du die Daten aus der DB abrufst und die dazu gehörigen MenuItems erstellst

[QUOTE=Sonecc]Also erstmal halte ich deine Vorgehensweise für recht kompliziert.
Sinnvoller ist es IMO den MenuDetectListener zu verwenden und dort das ContextMenü explizit zu erzeugen

Beispiel:

list.addMenuDetectListener(new MenuDetectListener() {
	@Override
	public void menuDetected(MenuDetectEvent e) {
		Menu menu = new Menu(list.getShell(), SWT.POP_UP);
		// Creates a new menu item 
		MenuItem exit = new MenuItem(menu, SWT.NONE);
		exit.setText("Test!");
	        exit.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				System.out.println("Test");
			}
		});
		// We need to make the menu visible
		menu.setVisible(true);
       }
});

Vorteil dieser Vorgehensweise ist, dass das Menü jedes mal neu erzeugt wird. Du musst die alten Menuitems also nicht extra disposen und kannst jedes mal context bezogene Informationen abrufen und einbinden. In deinem Fall würde das also bedeuten, dass du die Daten aus der DB abrufst und die dazu gehörigen MenuItems erstellst[/QUOTE]

Danke für den Hinweis. Habe ich jetzt mal umgeändert bei mir.

Mal ne andere Frage, kann man in eine “org.eclipse.swt.widgets.List” ein Objekt als Item speichern?

Meines Wissens nach nur einen String.
Du kannst aber die ListViewer Klasse verwenden (benötigt JFace).

Hier mal ein Beispiel dazu:
http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet039ListViewer.java

[QUOTE=Sonecc]Meines Wissens nach nur einen String.
Du kannst aber die ListViewer Klasse verwenden (benötigt JFace).

Hier mal ein Beispiel dazu:
http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet039ListViewer.java[/QUOTE]

Danke. Auch das habe ich jetzt umgesetzt.

Nun kommt das nächste Problem, dass ich nun das selektierte Item(Objekt) aus der Liste haben möchte.
Mit “ISelection listItems = listViewerAnlagen.getSelection();” bekomme ich nur ein String wieder vom selektierten Item.
Ich möchte aber das gespeicherte Objekt im ListViewer wiederbekommen.

EDIT: Hat sich erledigt…
Mit dem addSelectionChangedListener habe ich das nun gelöst…


listViewerAnlagen.addSelectionChangedListener(new ISelectionChangedListener()
		{
		    @Override
		    public void selectionChanged(SelectionChangedEvent event)
		    {
			IStructuredSelection selection = (IStructuredSelection) event.getSelection();
			...
		    }
		});