Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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).
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
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...
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.
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 ...
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!?
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
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()
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()