JMenu/JMenuItem Component auf der geaddet wurde

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi,

wie bekomme ich die Componente, auf welcher der JMenuItem oder JMenu geaddet wurde (Sprich ich hab ein JMenu bzw. JMenuItem und möchte wissen wo er liegt).

Danke!
 

The_S

Top Contributor
Öhm ... ja ... nee ... doch ... oder?

bin grad ein wenig verwirrt ... :bahnhof: :autsch: . Warum bekomm ich wenn ich ein JMenuItem habe, dass auf einem JMenu liegt als Parent ein JPopUpMenu zurück?

Könnte auch an meiner momentanten Verwirrung liegen .... ???:L
 

L-ectron-X

Gesperrter Benutzer
Kannst du mal näher erläutern, was du genau machen willst?
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenu.html#getItem(int)
Damit bekommst du einen JMenuItem aus einem JMenu...
 

The_S

Top Contributor
Nein, umgekehrt. Ich habe ein ziemlich verzweigtes Menu aus Menus und MenuItems. Jetzt wird irgendwo in der meinetwegen "3. Ebene" auf ein MenuItem geklickt. Jetzt möchte ich zurückverfolgen welchem Menu dieses MenuItem geaddet wurde, dann wieder welchem Menu dieses Menu geaddet wurde usw. usf. bis ich schließlich bei der MenuBar angekommen bin.
 

L-ectron-X

Gesperrter Benutzer
Dann sollte diese Methode weiterhelfen: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenuItem.html#getComponent()
 

The_S

Top Contributor
Danke, damit hab ichs auch anfänglich versucht, aber die liefert bei einem JMenuItem einfach nur selbiges JMenuItem zurück :autsch:
 

L-ectron-X

Gesperrter Benutzer
Naja, ein JMenu ist auch ein JMenuItem. Kannst du nicht die zurückgegebene Referenz dahingehend untersuchen?
 

The_S

Top Contributor
Wohingehend? Ob es ein JMenuItem oder ein JMenu ist? Sry, steh grad ein bisschen auf dem Schlauch.

Wenn ich in ein JMenu casten will bekomm ich eine ClassCastException geworfen und dieser Code (item ist ein JMenuItem)

Code:
		if (item == (JMenuItem)item.getComponent()) {
			System.out.println("Bloed");
		}

gibt Bloed aus. Von daher muss es sich ja um genau das selbe Objekt handeln oder nicht?
 

The_S

Top Contributor
Ich glaub ich werd mal ein wenig konkreter, vielleicht gehe ich das ganze ja falsch an ... ???:L .

Ich schreibe an einer Klasse die von JMenu erbt. Ziel ist es ein Menu zu haben, welchem ich einfach Verzeichnisstrukturen übergebe welche es dann korrekt anzeigt. zZ. ist das Format z. B. folgendes

"Menu:NochEinMenu:Item"

Hier mal der "Beta-Code" meiner Klasse BaumMenu

Code:
import javax.swing.JMenu;
import javax.swing.JMenuItem;

import java.awt.Component;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MenuBaum extends JMenu implements ActionListener {
	
	public MenuBaum(String text) {
		
		setText(text);
	}
	
	private boolean isMenu(Component comp) {
		
		try {
			JMenu blup = (JMenu)comp;
			return true;
		}
		catch (ClassCastException e) {
			return false;
		}
	}
	// statt getComponent eine Methode die mir das JMenu darunter zurückliefert
	private String getPathFromItem(JMenuItem item) {
		
		if (item == (JMenuItem)item.getComponent()) {
			System.out.println("Bloed");
		}
		return getPathFromMenu(item.getComponent()) + ":" + item.getText();
	}
	// statt getComponent eine Methode die mir das JMenu darunter zurückliefert
	private String getPathFromMenu(Component comp) {
		
		if (isMenu(comp)) {
			return getPathFromMenu(((JMenu)comp).getComponent()) + ((JMenu)comp).getText();
		}
		return ((MenuBaum)comp).getText();
	}
	
	public void addLine(String str) {
		
		String[] strAr = str.split(":");
		JMenu curMenu = this;
		JMenu newMenu = null;
		JMenuItem addThis = null;
		for (int i = 0; i < strAr.length - 1; i++) {
			newMenu = findMenu(curMenu, new JMenu(strAr[i]));
			if (newMenu == null) {
				newMenu = new JMenu(strAr[i]);
				curMenu.add(newMenu);
			}
			curMenu = newMenu;
		}
		addThis = new JMenuItem(strAr[strAr.length - 1]);
		addThis.addActionListener(this);
		curMenu.add(addThis);
	}
	
	public JMenu findMenu(JMenu menu, JMenu toFind) {
		
		Component[] comps = menu.getMenuComponents();
		JMenu value = null;
		for (Component comp : comps) {
			if (isMenu(comp)) {
				value = (JMenu)comp;
				if (value.getText().equals(toFind.getText())) {
					return value;
				}
			}
		}
		return null;
	}
	
	public void actionPerformed(ActionEvent evt) {
		
		System.out.println(getPathFromItem((JMenuItem)evt.getSource()));
	}
}

Hier ein Testcode, mit dem ihr BaumMenu mal in "Aktion" sehen könnt

Code:
import javax.swing.JFrame; 
import javax.swing.JMenuBar; 

public class GUI extends JFrame { 
       
   private JMenuBar menu = null; 
   private MenuBaum baum = null; 
    
   public GUI() { 
       
      menu = new JMenuBar(); 
      baum = new MenuBaum("Datei"); 
      baum.addLine("foo:bar:blup"); 
      baum.addLine("foo:bar:blap"); 
      baum.addLine("foo:blup:bar"); 
      baum.addLine("foo:blap"); 
      baum.addLine("bar"); 
      baum.addLine("blup:foo"); 
      menu.add(baum); 
      setJMenuBar(menu); 
      setVisible(true); 
      pack(); 
   } 
    
   public static void main(String[] args) { 
       
      new GUI(); 
   } 
}

Das angeklickte MenuItem rauszubekommen ist ja überhaupt kein Problem, nur kann es ja durchaus vorkommen dass in zwei Submenus (z. B. Foo und Bar) zweimal ein Menu mit dem selben Namen erscheint (z. B. Blup). Jetzt kann ich zwar wunderbar zurückgeben dass auf "Blup" geklickt wurde, aber nicht auf welches. Deswegen brauche ich alle darunter liegende Componenten um eine klare Zuweisung tätigen zu können. Hoffe meni Prob ist jetzt ein wenig klarer ...

Danke!
 
B

Beni

Gast
Hab jetzt dein Code nicht ganz durchgelesen, aber kannst du nicht den Menübaum von oben her rekursiv durchgehen, bis du dein JMenuItem gefunden hast?

Code:
private boolean test( JMenuItem item ){
  if( item instance JMenu ){
    for( JMenuItem child <von dem JMenu item> ){
      if( test( child ) ){
        // das war auf dem Pfad
        return true;
      }
    }
  }

  return item == dasGesuchteItem;
}
 

The_S

Top Contributor
Beni hat gesagt.:
Hab jetzt dein Code nicht ganz durchgelesen, aber kannst du nicht den Menübaum von oben her rekursiv durchgehen, bis du dein JMenuItem gefunden hast?

Code:
private boolean test( JMenuItem item ){
  if( item instance JMenu ){
    for( JMenuItem child <von dem JMenu item> ){
      if( test( child ) ){
        // das war auf dem Pfad
        return true;
      }
    }
  }

  return item == dasGesuchteItem;
}

So hatte ich mir das auch überlegt, aber das ist imho ja nicht unbedingt die feine Englische Art!? Evtl. leg ich mir auch ne HashMap an. Mal schauen. Aber auf jedenfall schonmal danke für den Ratschlag.

Aber eigentlich muss ich ja irgendwo herbekommen auf welcher Componente mein JMenuItem liegt ... :autsch: das kanns doch net sein!?
 

The_S

Top Contributor
Habs jetzt mit ner HashMap gemacht, wenn jemand ne bessere Lösung weiß bin ich für alles offen :)

Code:
import javax.swing.JMenu; 
import javax.swing.JMenuItem; 

import java.awt.Component; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

import java.util.HashMap;

public class MenuBaum extends JMenu implements ActionListener { 
	
	private HashMap<JMenuItem, String> paths = null;
	
	public MenuBaum(String text) { 
		
		paths = new HashMap<JMenuItem, String> ();
		setText(text); 
	}
	 
	public void addLine(String str) { 
		 
		String[] strAr = str.split(":"); 
		JMenu curMenu = this; 
		JMenu newMenu = null; 
		JMenuItem addThis = null; 
		for (int i = 0; i < strAr.length - 1; i++) { 
			newMenu = findMenu(curMenu, new JMenu(strAr[i])); 
			if (newMenu == null) { 
				newMenu = new JMenu(strAr[i]); 
				curMenu.add(newMenu); 
			} 
			curMenu = newMenu; 
		} 
		addThis = new JMenuItem(strAr[strAr.length - 1]); 
		addThis.addActionListener(this); 
		paths.put(addThis, str);
		curMenu.add(addThis); 
	} 
	 
	public JMenu findMenu(JMenu menu, JMenu toFind) { 
		 
		Component[] comps = menu.getMenuComponents(); 
		JMenu value = null; 
		for (Component comp : comps) { 
			if (comp instanceof JMenu) { 
				value = (JMenu)comp; 
				if (value.getText().equals(toFind.getText())) { 
					return value; 
				} 
			} 
		} 
		return null; 
	} 
	 
	public void actionPerformed(ActionEvent evt) { 
		 
		System.out.println(paths.get((JMenuItem)evt.getSource())); 
	} 
}
 

semi

Top Contributor
Popupmenüs in Swing haben i.d.R. keinen Parent, daher muss man immer
den "Aufrufer" ermitteln, um das übergeordnete Menü zu kriegen.
Es ist immer abwechselnd wie folgt aufgebaut
Code:
MenuBar
 |-- Menu
      |-- Popup
           |-- Menu
                |-- Popup
                     |-- MenuItem
Code:
private void getPathFromItem(JMenuItem item, StringBuilder path)
{
  Component parent = item.getParent();
  if(parent instanceof JPopupMenu)
    parent = ((JPopupMenu)parent).getInvoker();

  if(parent instanceof JMenuItem)
  {
    getPathFromItem((JMenuItem)parent, path);
    path.append(item.getText()).append(":");
  }
}

private String getPathFromItem(JMenuItem item)
{
  StringBuilder path = new StringBuilder(64);
  getPathFromItem(item, path);
  return path.substring(0, path.length()-1); // das : am Ende abschneiden
}
Gruß,
Michael

PS: Du kannst die Pfade auch als Namen der Menüs bzw. MenuItems setzen.
Siehe Component#setName(String name)
Beim Erstellen eines Items machst du dann sowas
Code:
JMenuItem item = ...
item.setName(menu.getName() + ":" + itemName);
menu.add(item);

// dann kannst du den Pfad der Menüs und Items einfach mit getName() abfragen

item.getName()
 

The_S

Top Contributor
semi hat gesagt.:
PS: Du kannst die Pfade auch als Namen der Menüs bzw. MenuItems setzen.
Siehe Component#setName(String name)
Beim Erstellen eines Items machst du dann sowas
Code:
JMenuItem item = ...
item.setName(menu.getName() + ":" + itemName);
menu.add(item);

// dann kannst du den Pfad der Menüs und Items einfach mit getName() abfragen

item.getName()

Hey danke. Manchmal sieht man den Wald vor lauder Bäumen nicht mehr. :applaus: Ich mach das jetzt auch so, dürfte wohl das Performandeste sein.

Und zu deinem 1. Tipp: Danke, man lernt nie aus!!! :toll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JMenuBar, JMenu, JMenuItem wird nicht angezeigt AWT, Swing, JavaFX & SWT 16
S Probleme mit JMenu und JMenuItem AWT, Swing, JavaFX & SWT 2
A Bei Klick auf disabled JMenuItem JMenu nicht schließen AWT, Swing, JavaFX & SWT 2
P JMenu / JMenuItem durch Rekursion Icons entfernen AWT, Swing, JavaFX & SWT 4
G JMenu About ohne JMenuItem AWT, Swing, JavaFX & SWT 11
Z JMenu und JMenuItem: MouseOver-Farbe ändern AWT, Swing, JavaFX & SWT 9
B Alle jMenu und JMenuItem in einem Array AWT, Swing, JavaFX & SWT 4
ExceptionOfExpectation JMenu, setMnemonic(Char k) bringt keine Wirkung AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
MaxG. Swing JMenu einen Listener Hinzufügen AWT, Swing, JavaFX & SWT 25
Y Backgroundcolor JMenu AWT, Swing, JavaFX & SWT 2
D Merkwürdiges Verhalten vom JMenu AWT, Swing, JavaFX & SWT 4
X JMenu Menu-Bar ausrichtung ändern im Programm AWT, Swing, JavaFX & SWT 0
S AWT JTextFields durch Array im JMenu erzeugen? AWT, Swing, JavaFX & SWT 19
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
S Swing JMenu löscht auf panel gezeichnetes AWT, Swing, JavaFX & SWT 3
llabusch Prüfen ob JMenu leer ist & löschen AWT, Swing, JavaFX & SWT 1
3 Swing Vertikaler Separator zwischen JMenu's AWT, Swing, JavaFX & SWT 2
S JMenu unter JPanel versteckt AWT, Swing, JavaFX & SWT 5
S jMenu wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
T JMenu reagiert auf F-Taste AWT, Swing, JavaFX & SWT 6
Jagson Mit JMenu auf jDialog zurück? Wie? AWT, Swing, JavaFX & SWT 8
Kenan89 JMenu Fragen AWT, Swing, JavaFX & SWT 5
B Swing JMenu zwischen anderen Componenten AWT, Swing, JavaFX & SWT 4
R JMenu aus Ordnern AWT, Swing, JavaFX & SWT 4
P JMenu aus Dateistruktur AWT, Swing, JavaFX & SWT 2
I JMenu AWT, Swing, JavaFX & SWT 5
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
frankred Swing JMenu verschwindet nicht beim klicken ausserhalb des JMenu! AWT, Swing, JavaFX & SWT 4
F JMenu auf JPanel AWT, Swing, JavaFX & SWT 5
E Swing JMenu in GUI einbinden AWT, Swing, JavaFX & SWT 5
E JMenu übersetzen AWT, Swing, JavaFX & SWT 9
W JMenu wird vom JPanel ständig überzeichnet... Abhilfe? AWT, Swing, JavaFX & SWT 3
P JMenu-Erweiterung in externer Datei AWT, Swing, JavaFX & SWT 5
T Swing JMenu als Button behandeln AWT, Swing, JavaFX & SWT 4
T Swing jMenu AWT, Swing, JavaFX & SWT 6
R JMenu in JToolBar AWT, Swing, JavaFX & SWT 6
T Swing JMenu falsch positioniert AWT, Swing, JavaFX & SWT 2
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
Developer_X Swing JMenu Bug gefunden AWT, Swing, JavaFX & SWT 5
D Swing JMenu wieder schließen lassen AWT, Swing, JavaFX & SWT 7
E Swing Einfache Frage zu JMenu AWT, Swing, JavaFX & SWT 4
hdi Welche Klasse + Listener für JMenu AWT, Swing, JavaFX & SWT 2
A JMenu Bug? AWT, Swing, JavaFX & SWT 12
J JMenu unterschiedliche Background einstellen AWT, Swing, JavaFX & SWT 5
C JMenu bzw. JButton mit URL versehen AWT, Swing, JavaFX & SWT 2
G ActionListener auf JMenu funktioniert nicht AWT, Swing, JavaFX & SWT 4
X JMenu AWT, Swing, JavaFX & SWT 2
D Abfrageproblem bei JMenu mit Icon AWT, Swing, JavaFX & SWT 2
Ernesto95 Programmabsturz beim Einbinden eines JMenu AWT, Swing, JavaFX & SWT 18
P jMenu ohne Menubar - Jigloo zeigts AWT, Swing, JavaFX & SWT 2
S JMenu und ActionListener per Schleife erzeugen AWT, Swing, JavaFX & SWT 3
G Scrollbares JMenu AWT, Swing, JavaFX & SWT 4
G JMenu problem mit der Breite von einer JCheckBox AWT, Swing, JavaFX & SWT 2
V JMenu und die Tabs von JTabbedFrame sind auf einmal schwarz AWT, Swing, JavaFX & SWT 3
H JMenu wird leider unterhalb! der CanvasFläche dargestellt AWT, Swing, JavaFX & SWT 5
X Swing: Bilder überlagern JMenu AWT, Swing, JavaFX & SWT 4
T ImageIcon als Seperator im Jmenu AWT, Swing, JavaFX & SWT 8
padde479 JMenu mnemonic AWT, Swing, JavaFX & SWT 3
N JMenu und JPanel AWT, Swing, JavaFX & SWT 5
B 1 JMenu in Mehrere JMenus AWT, Swing, JavaFX & SWT 2
G Canvas, JMenu, und BufferStrategy AWT, Swing, JavaFX & SWT 2
D JMenu -> Accelerator AWT, Swing, JavaFX & SWT 2
I JMenu(Item) und FocusListener AWT, Swing, JavaFX & SWT 3
R JMenu + Farbe von Hintergrund AWT, Swing, JavaFX & SWT 2
M JMenu verschwindet unter ScrollPane AWT, Swing, JavaFX & SWT 3
D Schriftfarbe ändern (JFrame, JMenu etc) AWT, Swing, JavaFX & SWT 3
K JMenu wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
I JMenu wird nicht dargestellt AWT, Swing, JavaFX & SWT 12
H JMenu soll "offen bleiben" AWT, Swing, JavaFX & SWT 3
M JMenuBar - JMenu mit Tastenkombination aufrufen / anzeigen AWT, Swing, JavaFX & SWT 8
redztripe Haken in JMenu setzen? AWT, Swing, JavaFX & SWT 8
G Icon zu JMenu AWT, Swing, JavaFX & SWT 3
M JMenu auf JComponent? AWT, Swing, JavaFX & SWT 10
G JMenu - neuer Frame AWT, Swing, JavaFX & SWT 2
X Verschwinden des JMenu unterbinden AWT, Swing, JavaFX & SWT 3
R JMenu copy Focus-Problem AWT, Swing, JavaFX & SWT 2
E JTextArea überlagert JMenu AWT, Swing, JavaFX & SWT 2
D JMenu spinnt AWT, Swing, JavaFX & SWT 7
R JMenu einträge werden überdeckt AWT, Swing, JavaFX & SWT 3
T JMenu erscheint nicht richtig AWT, Swing, JavaFX & SWT 6
G JMenu Info-Fenster ganz Rechts AWT, Swing, JavaFX & SWT 5
H JMenu zuklappen AWT, Swing, JavaFX & SWT 7
K JMenu Aktionen AWT, Swing, JavaFX & SWT 3
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
J Swing JMenuItem blockiert JMenuBar AWT, Swing, JavaFX & SWT 2
F JMenuItem mit KeyStroke kombinieren AWT, Swing, JavaFX & SWT 1
javampir Look&Feel von JMenuItem AWT, Swing, JavaFX & SWT 3
K JMenuItem-Shortcut WENN Menüleiste verborgen ist AWT, Swing, JavaFX & SWT 4
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
J Swing JMenuItem-Event?? AWT, Swing, JavaFX & SWT 3
J Swing JMenuItem auf setEnabled(false) setzen? AWT, Swing, JavaFX & SWT 3
B JMenuItem Anzeigeproblem AWT, Swing, JavaFX & SWT 6
E Swing JTextField als JMenuItem AWT, Swing, JavaFX & SWT 3
G PopupMenu für ein JmenuItem AWT, Swing, JavaFX & SWT 3
N Swing Nimbus arbeitet nicht korrekt korrekt bei setEnabled() für JMenuItem AWT, Swing, JavaFX & SWT 2
F JMenuItem exit AWT, Swing, JavaFX & SWT 2
M Swing JMenuItem und der ActionListener AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben