rechte Maustaste->Menu->noch ein Menu

fischmir

Grünschnabel
Hallöchen,

da ich immer wieder im Netz über diese Seite stolpere, dachte ich mir ich suche mal hier Hilfe...

Ich habe ein Tabelle mit mehreren Spalten. Beim klicken auf die rechte Maustase öffnet sich ein Menu mit mehreren Möglichkeiten wie BEarbeiten, Zeile löschen etc.

Unter anderem soll dort auch die Möglichkeit "Spalte löschen" stehen. Daraufhin soll ich ein weiteres Menu aus den Namen der derzeit vorhanden Spaltennamen generieren. Die Abfrage der Namen ist kein Problem...aber ich kriege einfach kein zweites Menu mit Namen zum voscheinen...


Code:
public void mouseDown(MouseEvent e) 
			{
				if(e.button == 3)
				{
					Menu rightButton = new Menu(myTable);
					MenuItem edit = new MenuItem(rightButton,SWT.CASCADE);
					edit.setText("Edit");
					
					MenuItem sep = new MenuItem(rightButton,SWT.SEPARATOR);
					
					MenuItem newRow = new MenuItem(rightButton,SWT.CASCADE);
					newRow.setText("New Row");
					
					MenuItem delRow = new MenuItem(rightButton,SWT.CASCADE);
					delRow.setText("Remove Row");
					
					sep = new MenuItem(rightButton,SWT.SEPARATOR);
					
					final MenuItem delColumn = new MenuItem(rightButton,SWT.CASCADE);
					delColumn.setText("Remove Column");
	
					edit.addSelectionListener(new SelectionListener()
					{
						public void widgetSelected(SelectionEvent e)
						{
							pressedEditMarked();	
						}
	
						public void widgetDefaultSelected(SelectionEvent e)
						{
							// TODO Auto-generated method stub
							
						}	
					});
					
					newRow.addSelectionListener(new SelectionListener()
					{
						public void widgetSelected(SelectionEvent e)
						{
							pressedNewRow();	
						}
							public void widgetDefaultSelected(SelectionEvent e)
						{		
						}		
					});
					
					delRow.addSelectionListener(new SelectionListener()
					{
						public void widgetSelected(SelectionEvent e)
						{
							//pressedDeleteRow();
							Menu lang = new Menu(delColumn);
							
							MenuItem de = new MenuItem(lang,SWT.CASCADE);
							de.setText("de");
							MenuItem en = new MenuItem(lang,SWT.CASCADE);
							en.setText("en");
							lang.setVisible(true);
						}
						public void widgetDefaultSelected(SelectionEvent e)
						{
							// TODO Auto-generated method stub	
						}
					});
					
					delColumn.addSelectionListener(new SelectionListener()
					{
						public void widgetSelected(SelectionEvent e)
						{
							//pressedDeleteColumn(ini);						
						}
						public void widgetDefaultSelected(SelectionEvent e)
						{
							// TODO Auto-generated method stub	
						}
					});
					
					rightButton.setVisible(true);
				}
				
			}

Muss ich diesen kleinen Pfeil, der in solchen menüs immer auftaucht auch noch selber einfügen?
Ich habe nun den ArmListener hinzugefügt, und habe den Pfeil...aber es erscheint immernoch kein Menü?!

Gruß
Christian
 
Zuletzt bearbeitet:
Ok, snape, dann möchte ich dir auch auf die Beine helfen. ;)

So könntes es aussehen, nicht elegant, aber alles drin, für jeden der dieses Problem auch hat...
Code:
	public void mouseDown(MouseEvent e) 
			{
				if(e.button == 3)//rechte Maustaste
				{
					final Menu rightButton = new Menu(myTable);
					MenuItem edit = new MenuItem(rightButton,SWT.CASCADE);
					edit.setText("Edit");
					
					MenuItem sep = new MenuItem(rightButton,SWT.SEPARATOR);
					
					MenuItem newRow = new MenuItem(rightButton,SWT.CASCADE);
					newRow.setText("New Row");
					
					MenuItem delRow = new MenuItem(rightButton,SWT.CASCADE);
					delRow.setText("Remove Row");
					
					sep = new MenuItem(rightButton,SWT.SEPARATOR);
					
					final MenuItem delColumn = new MenuItem(rightButton,SWT.CASCADE);
					delColumn.setText("Remove Column");
					
					/*
					 * UNtermenu generieren 
					 */
					final Menu lang = new Menu(rightButton);
					
					int countLang = myTable.getColumnCount();
					final TableColumn tcs[] = myTable.getColumns();
					MenuItem mis [] = new MenuItem [countLang];
					
					for(int i=0; i< countLang; i++)
					{
						final String ini = tcs[i].getText();
						final TableColumn tc = tcs[i];
						mis[i] = new MenuItem(lang,SWT.CASCADE);
						mis[i].setText(ini);
						mis[i].addSelectionListener(new SelectionListener()
						{
							public void widgetSelected(SelectionEvent e) 
							{
								//removeLanguage, wenn angeklickt!
								b.removeLanguage(ini);
								int index = myTable.indexOf(tc);
								System.out.println("Spaltennummer: "+index);
								//falls letzte Spalte, dann muss alles genullt werden
								if(tcs.length==1)
								{
									//letzte Spaltegelöscht
									//dann alle inhalte löschn,
									System.out.println("Letzte Spalte gelöscht");
									tc.setWidth(3);
									tc.dispose();
									myTable.clearAll();
									myTable.removeAll();
								}
								else
								{
									//spalte gelöscht
									tc.dispose();
									System.out.println("Spalte entfernt.");
								}
								//durch das löschen einer Spalte, kann NICHT der fall auftreten
								//das noch eine Spalte leer wird, daher nur removeEmptyRows
								removeEmptyRows();
								tc.setWidth(10);
							}
							public void widgetDefaultSelected(SelectionEvent e) 
							{
											
							}
						});
					}
					
					delColumn.setMenu(lang);

nun gut...um es lauffähig zu machen, gebraucht es noch ein paar Zeilen, aber das WIE sollte dann benatwortet sein ;)

PS: am wichitgsten ist die letzte Zeile! Die darf nicht mit in die anonyme Klasse genommen werden, da das Event des SelectionListeners mit jeder Mausbewegung auf dem MenItem ausgelöst wird. So würde sich das Menu nach jeder Bewegung neu zeichnen und das sieht nicht gut aus.

Viele Grüße
fischmir
 
Zurück