Kontextmenü

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Ich habe in einem Dialog ein KontextMenü in Form einer von JPopupMenu abgeleiteten Klasse. Nun musste ich einen seltsamen Fehler feststellen. Starte ich das Programm von Eclipse aus, funktioniert alles wie es soll, starte ich mein Programm aber allein, so wird der jeweilige Menüeintrag, auf den der Mauszeiger gerade zeigt, nicht markiert. Hat jemand eine Idee, warum das so sein könnte? Und falls ja, hat dieser jemand auch die Lösung?

kontextmenue.jpg
 
B

Beni

Gast
Benutzt du beides mal dieselbe Java-Version? In Eclipse kann man das im "run"-Dialog einstellen, in der freien Welt durch die Eingabe "java -version" in der Konsole/Terminal testen.
 

Evolver

Bekanntes Mitglied
Also in der Konsole gibt er mir Version 1.6.0_03 aus, in Eclipse 1.6.0_01.

//EDIT:
Wenn ich das Programm in Eclipse mit 1.6.0_03 starte, funktioniert das Markieren der Menüeinträge auch nicht mehr. Also neue Frage: Woran kann es liegen, dass es mit 0_01 noch funktioniert und mit 0_03 nicht mehr?
 

Evolver

Bekanntes Mitglied
Also hier mal noch der Code zum PopupMenu. Die Klasse ist innerhalb meiner Dialogklasse (dieser Dialog beinhaltet im Wesentlichen einen JTree) definiert.
Code:
class DBOverviewContextMenu extends JPopupMenu
	{
		private JMenuItem mNewFolder, mNewProject, mChangeName;
		
		
		public DBOverviewContextMenu()
		{
			super();
			mNewFolder = new JMenuItem("Neuer Ordner");
			mNewProject = new JMenuItem("Neues Projekt");
			mChangeName = new JMenuItem("Name ändern");
			this.add(mNewFolder);
			this.add(mNewProject);
			this.addSeparator();
			this.add(mChangeName);
			
			ActionListener tPopupAction = new ActionListener()
			{
				public void actionPerformed(ActionEvent pAE)
				{
					TreePath tCurrentPath = mTreeView.getSelectionPath();
					if(pAE.getActionCommand().equals("Name ändern")) {
						if(tCurrentPath!=null) mTreeView.startEditingAtPath(tCurrentPath);
					}
					else {
						if(tCurrentPath!=null) {
							DefaultMutableTreeNode tInsertionNode = (DefaultMutableTreeNode)tCurrentPath.getLastPathComponent();
							int tParent;
							if(tInsertionNode.getUserObject() instanceof String) tParent = 0;
							else if(tInsertionNode.getUserObject() instanceof UMLFolder) tParent = ((UMLFolder)tInsertionNode.getUserObject()).getKey();
							else return;
							UMLAdvancedElement tNewElement = null;
							if(pAE.getActionCommand().equals("Neuer Ordner")) tNewElement = new UMLFolder("", tParent);
							else tNewElement = new UMLProject("", tParent);
							
							if(tNewElement==null) return;
							DefaultMutableTreeNode tNewChild = new DefaultMutableTreeNode(tNewElement);
							mTreeModel.insertNodeInto(tNewChild, tInsertionNode, tInsertionNode.getChildCount());
							
							tCurrentPath = tCurrentPath.pathByAddingChild(tNewChild);
							if(tCurrentPath!=null) {
								mTreeView.setSelectionPath(tCurrentPath);
								mTreeView.startEditingAtPath(tCurrentPath);
							}
						}
					}
				}
			};
			mNewFolder.addActionListener(tPopupAction);
			mNewProject.addActionListener(tPopupAction);
			mChangeName.addActionListener(tPopupAction);
		}
		
		
		public void showMenu()
		{
			TreePath tPath = mTreeView.getSelectionPath();
			if(tPath==null) return;
			mNewFolder.setEnabled(true);
			mNewProject.setEnabled(true);
			mChangeName.setEnabled(true);
			Object tSelectedObject = ((DefaultMutableTreeNode)tPath.getLastPathComponent()).getUserObject();
			if(tSelectedObject instanceof UMLProject) mNewFolder.setEnabled(false);
			if(tSelectedObject instanceof UMLProject || tSelectedObject instanceof String) mNewProject.setEnabled(false);
			if(tSelectedObject instanceof String) mChangeName.setEnabled(false);
			this.setVisible(true);
		}
	}
 

Evolver

Bekanntes Mitglied
Mir ist jetzt ein Kontextmenü aufgefallen, das war noch da als das Programm schon geschlossen war. Also dachte ich: Das weiß wohl nicht, wer sein Besitzer ist!? Und dies war auch die Lösung des Problems. Wenn ich dem PopupMenü mit der Funktion setInvoker(Component invoker) den Besitzer (der Dialog) übergebe, klappt alles.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben