ActionListener aus Package

Status
Nicht offen für weitere Antworten.

minzel

Aktives Mitglied
Hallo!

Also habe nun schon vermehrt gesucht und bin zum Punkt gekommen das es ein gutes Argument ist, einen ActionListener da zu Implementieren wo er auch gebraucht wird. Wie dem auch sei ... ich komm nicht weiter.

Problem:

Code:
public class JMenuBar extends javax.swing.JMenuBar implements ActionListener {

	private JMenu menu;

	public JMenuBar(String xmlFile) {
		try {
			Document doc = new SAXBuilder().build(new File(xmlFile));
			Element root = doc.getRootElement();

			Iterator jmenu = root.getChildren("JMenu").iterator();
			while (jmenu.hasNext()) {
				Element m_item = (Element) jmenu.next();
				menu = new JMenu(m_item.getAttributeValue("name"));

				Iterator jmenuitem = m_item.getChildren().iterator();
				while (jmenuitem.hasNext()) {
					Element item = (Element) jmenuitem.next();

					menu.add(createItem(item.getName(), item
							.getAttributeValue("name")));
				}
				this.add(menu);
			}

		} catch (JDOMParseException e) {
			System.out.println(e);
			System.exit(1);
		} catch (IOException e) {
			System.out.println(e);
			System.exit(1);
		} catch (JDOMException e) {
			System.out.println(e);
			System.exit(1);
		} catch (NullPointerException e) {
			System.out.println(e);
			System.exit(1);
		}
	}

	private JComponent createItem(String item, String itemName) {

		JMenuItem jMenuItem;
		JSeparator jSeparator;

		if (item.equals("JMenuItem")) {
			jMenuItem = new JMenuItem(itemName);
			jMenuItem.addActionListener(this);
			return jMenuItem;
		} else if (item.equals("JSeparator")) {
			jSeparator = new JSeparator();
			return jSeparator;
		}
		return null;
	}

	public void actionPerformed(ActionEvent e) {
	}
}

Dies ist eine Klasse von meinem Package was ich aufbauen will. Diese liest eine XML-Datei aus und baut dementsprechend eine JMenuBar auf. Das funktioniert ja an und für sich.

Mein Gedanke ist nun samt anderen Klassen das ganze in ein Package zu packen und für meine Projekte zu verwenden. Einzigstens Makel ist der ActionListener. Wie schaffe ich es DIESEN in eine andere Klasse zu Implementieren?

Habe bereits versucht diese Klasse 'JMenubar' mit einem Interface zu koppel "IJMenuBar" worin sich die Methode "actionPerformed" befindet. Implementiere ich allerdings dieses Interface in eine andere Klasse inc. der Methode zeigt beispielsweise "e.getActionCommand()" keine reaktion.

Zur Verdeutlichung: Ich komme ja an diese Methide actionPerformed in einem Package nicht mehr ran.

Code:
Pseudocode:

class TestRunner implements IJMenuBar {
...
public TestRunner() {
	
	public void actionPerformed(ActionEvent e) {
		System.out.println(e.getActionCommand());
	}
...
}

Danke schon mal im Voraus!
 

André Uhres

Top Contributor
Warum übergibst du nicht einfach den ActionListener im Konstruktor:
Code:
public JMenuBar(String xmlFile, ActionListener actionListener) {
un verwendest diesen?
 

minzel

Aktives Mitglied
Wenn dies eine elegante Lösung ist kann man das sicher so machen ... aber ich weiß nicht so recht.

@Wildcard
Konstrukt:

MyPackage:
- JMenuBar (Klasse)

Das MyPackage will ich in mein (anderes) Projekt einbinden und verwenden.
Diese Klasse "JMenuBar" erstellt mir aus einer XML-Datei ein JMenuBar in Java :) Soweit so gut ...
Wenn ich aber mit dem Menü etwas anfangen will muss ich einen ActionListener einbinden.

Diesen kann ich aber im Package selbst nicht mehr ändern, da dieser fest in Package definiert ist.
Wenn ich jetzt über eine Schnittstelle der Klasse JMenuBar (Meiner eigenen Klasse) gehe und actionPerformed extrahiere und in mein Projekt implementiere, zeigt dieser keine wirkung.
 

minzel

Aktives Mitglied
Naja hat den gleichen effekt (nämlich keinen) wie das normale einbinden eines ActionListener.
Hab es hier noch mal mit einem Interface versucht. Diesmal von der Klasse JMenuBarAction. und die Methode actionPerformed im Interface (IJMenuBarAction) aufgenommen und diese in mein Projekt implementiert.
Wenn ich dort nun die methode 'actionPerformed' "überschreibe" zeigt nicht mal ein sysout eine wirkung.
 

minzel

Aktives Mitglied
Also habe jetzt mal die variante probiert den ActionListener einfach mitzugeben, aber find das nicht so prickelnd. Es funktioniert aber. Hier nochmal das ganze Verfahren mit dem Interface:
(Nicht wundern wegen der Implementierung des Menüs, das is nich absichtlich jetzt so, hab nur alles überflüssige mal entfernt)


TestRunner.java
Code:
public class TestRunner extends JFrame implements IJMenuBar {

	public TestRunner() {
		
		new JFrame();
		this.setJMenuBar( new JMenuBar() );
		
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		this.setSize(300,200);
		this.setLocationRelativeTo(null);
		this.setVisible(true);		
	}
	
	public void actionPerformed(ActionEvent e) {
		System.out.println(e.getActionCommand());
	}

	public static void main(String[] args) {
		new TestRunner();
	}
}

JMenuBar.java
Code:
public class JMenuBar extends javax.swing.JMenuBar implements ActionListener,
		IJMenuBar {

	public JMenuBar() {

		JMenu datei = new JMenu("Datei");
		datei.add( (JMenuItem) createItem("JMenuItem", "Beenden"));
		this.add(datei);
	}

	private JComponent createItem(String item, String itemName) {

		JMenuItem jMenuItem;
		JSeparator jSeparator;

		if (item.equals("JMenuItem")) {
			jMenuItem = new JMenuItem(itemName);
			jMenuItem.addActionListener(this);
			return jMenuItem;
		} else if (item.equals("JSeparator")) {
			jSeparator = new JSeparator();
			return jSeparator;
		}
		return null;
	}

	/*
	 * (Kein Javadoc)
	 * 
	 * @see de.jpr.jmenubar.IJMenuBar#actionPerformed(java.awt.event.ActionEvent)
	 */
	public void actionPerformed(ActionEvent arg0) {
	}
}

IJMenuBar.java
Code:
public interface IJMenuBar {

	public abstract void actionPerformed(ActionEvent arg0);

}

Tja, so in etwa solls sein und laufen, tut es aber nicht.
 

Wildcard

Top Contributor
Also wirklich.. deine Klasse genauso wie eine Java Klasse zu nennen und dann auch noch von dieser zu erben,
Verschlüssel doch in zukunft alle Bezeichner noch mit ROT13, dann ist's wenigstens konsistent :autsch:
Ich sehe zZ einfach nicht was du dir da vorstellst. Was unterscheidet deine JMenuBar von der normalen?
Du setzt doch immer noch Actions drauf. An der Stelle an der du eine Action/JMenuItem auf das Menü setzt kannst du auch einen Listener dranhängen. Wozu also das Interface?
 

minzel

Aktives Mitglied
Weil JMenuBar und IJMenuBar letztendlich im Package selbst verschwinden.
Und da komm ich ja nicht mehr an den ActionListener ran,
 

minzel

Aktives Mitglied
Danke für die aufbauenden Worte ^^
Ich glaube würde ich es hinbekommen würde ich diese Frage nicht hier im Forum stellen ;)

Hoffe es weiß noch jemand Rat.
 

Wildcard

Top Contributor
Wenn zwei Klassen das gleiche Interface implementieren sind sie damit in keiner Weise gekoppelt und können auch keine Methoden der anderen Klasse überschreiben. Du brauchst wie gesagt eine Methode in der du einen ActionListener (oder gleich eine AbstractAction)übergibst.
 

minzel

Aktives Mitglied
Werd daraus nicht wirklich schlau. Soll also bedeuten (mittlerweile umbenannt) dass ich in XMLMenuBar eine Methode erstellen soll die den ActionListener übergibt.

Wenn ja wie kann ich diesen einer Klasse zuweisen?
 

Wildcard

Top Contributor
Nein, du musst in XMLMenuBar eine Methode(oder Konstruktor) anbieten in der man einen ActionListener übergeben kann, den die XMLMenuBar dann an das entsprechende Objekt 'anschließt'
 

minzel

Aktives Mitglied
habe es jetzt so gemacht:

XMLMenuBar.java
Code:
...
	public ActionListener getActionListener() {
		return this;
	}
...

So kann ich diesen dann aufrufen:

Code:
xmlMenuBar.getActionListener();

Auf was genau weise ich das aber zu?

this =

funktioniert an der stelle nicht mehr.
 

Wildcard

Top Contributor
Ist das wirklich so schwer zu verstehen das du einen ActionListener übergeben musst?

XMLMenuBar:

Code:
addActionListenerToFancyObject(ActionListener listener)
{
    myFancyObject.addActionListener(listener);
}
 

minzel

Aktives Mitglied
Also ehrlich gesagt ja ...
Dann müßte ich den ActionListener ja so oder so übergeben.

Wenn ich das satt der Methode im Copy-Konstrukt mache wäre das uneffizient da 2 Instanzen.
(1. ActionListener / 2. XML)

Denn der Listener wird zu laufzeit gefüllt. und wenn ich nach initialisieren der XMLMenuBar den listener zuweisen kommt trotzdem keine Reaktion. (Gleiches Verfahren wie ich es mit dem Interface vorhatte)

PS:
Schlimmer noch wie ich gerade sehe. Wenn ich im 2. schritt den actionlistener übergebe wird er sogar überschrieben.

PS2:
Hab das ganze jetzt folgendermaßen abgeändert:

Code:
XMLMenuBar xmlMenu = new XMLMenuBar();
		xmlMenu.addActionListener(this);
		xmlMenu.createMenuBar("config/dummy.xml");
		this.setJMenuBar( xmlMenu );

funktioniert zwar, aber stimmt mich nicht so zufrieden.
 

André Uhres

Top Contributor
André Uhres hat gesagt.:
Warum übergibst du nicht einfach den ActionListener im Konstruktor
minzel hat gesagt.:
Wenn dies eine elegante Lösung ist kann man das sicher so machen
Deine Menübar kommt jedenfalls nicht ohne ActionListener aus.
Demnach fände ich es sogar sehr elegant, wenn man ihn schon im Konstruktor mitgeben kann.
Auch Standardklassen bieten diese Möglichkeit an (siehe z.B. javax.swing.Timer).
 

Wildcard

Top Contributor
Ich finde das auch ok. Allerdings sollte es optional sein, da man sowieso eine remove braucht. Wenn man remove hat braucht man auch add.
Damit währe die Übergabe im Konstruktor nicht nötig und sollte daher optional sein.
 

minzel

Aktives Mitglied
Danke nochmal für den Hinweis. Habe es jetzt wie folgt gemacht:

Code:
XMLMenuBar xmlMenu = new XMLMenuBar(this);
xmlMenu.createMenuBar("config/dummy.xml");
this.setJMenuBar( xmlMenu );

Sieht schon ganz freundlich aus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JButton und ActionListener Allgemeine Java-Themen 3
F System Tray Menubutton ActionListener Allgemeine Java-Themen 5
V Event Handling ActionListener nur bei "checked" CheckBoxMenuItem Allgemeine Java-Themen 2
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
C ActionListener - ToggleButton als von KI geklickt "markieren" Allgemeine Java-Themen 2
A ActionListener blockiert Bedienung des ganzen Systems Allgemeine Java-Themen 8
Z Swing Problem mit ActionListener Allgemeine Java-Themen 6
X getText undefiniert in ActionListener Allgemeine Java-Themen 5
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
P Variablen Variable von void im ActionListener verwenden Allgemeine Java-Themen 3
F Swing NetBeans nimmt ActionListener nicht an. Allgemeine Java-Themen 2
C Event Handling ActionListener manuell auslösen Allgemeine Java-Themen 8
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
P ActionListener / Label Name auslesen Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
T ActionListener und Singleton Allgemeine Java-Themen 15
J ActionListener-Klasse will Methode nicht annehmen Allgemeine Java-Themen 6
G Übergabeparameter an ActionListener Allgemeine Java-Themen 9
Z Mit ActionListener in anderem Frame lauschen? Allgemeine Java-Themen 3
W 2 Klassen + ActionListener Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
C JTree: ActionListener auf die Nodes Allgemeine Java-Themen 3
C ActionListener reagiert zu oft Allgemeine Java-Themen 5
MQue ActionListener und GUI trennen Allgemeine Java-Themen 3
L ActionListener / Buttons Allgemeine Java-Themen 8
E ActionListener Allgemeine Java-Themen 8
TheJavaKid Programmablauf anhalten bis actionlistener ausgeführt wurde Allgemeine Java-Themen 6
F AbstractAction und ActionListener Allgemeine Java-Themen 2
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
K ActionListener ohne implements? Allgemeine Java-Themen 2
L ActionListener > Variable ... u.v.m. Allgemeine Java-Themen 19
W ActionListener + Klasse einbinden Allgemeine Java-Themen 2
H JavaFX Warnung in package Zeile Allgemeine Java-Themen 2
jumichel Eclipse The package javax.mail is not accessible Allgemeine Java-Themen 3
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
G Mac Package auslesen Allgemeine Java-Themen 17
F Reason: Missing Constraint: Import-Package: okhttp3.internal.http; version="0.0.0" Allgemeine Java-Themen 0
Tommy135 Input/Output Application aus Java package starten Allgemeine Java-Themen 2
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
T Plötzlich wird package nicht mehr gefunden Allgemeine Java-Themen 3
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
Sin137 Struktur der Klassen & Package Allgemeine Java-Themen 2
F Problem mit "package" Allgemeine Java-Themen 7
L Stack overflow bei einer endrekursiven Funktion (Anwendung: Spezialform des Package Merge) Allgemeine Java-Themen 4
D Classloader ohne Package Allgemeine Java-Themen 10
T Package durchsuchen Allgemeine Java-Themen 11
S leeres package obwohl inhalt da Allgemeine Java-Themen 53
S leeres Package nach neuinstallation des Pc Allgemeine Java-Themen 6
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
G Gleiche Packages in verschiedenen JAR Dateien - Welches Package wird verwendet? Allgemeine Java-Themen 5
D Package switching Allgemeine Java-Themen 7
G log4j package filter Allgemeine Java-Themen 10
M Klasse aus xyz.class Datei laden / package entfernen? Allgemeine Java-Themen 4
Bastifantasti Package installieren Allgemeine Java-Themen 2
G Package / Architektur Allgemeine Java-Themen 11
J package javax.servlet does not exist Allgemeine Java-Themen 5
M Dateien aus dem Package im Jar-File rauskopieren Allgemeine Java-Themen 3
V Zugriff auf Default-Package? Allgemeine Java-Themen 6
S Package in verschiedene Projekten einbinden? Allgemeine Java-Themen 3
J Kein Zugriff auf Klassen im Default Package Allgemeine Java-Themen 8
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
ARadauer Package Struktur Allgemeine Java-Themen 3
G bild in package Allgemeine Java-Themen 6
G Klasse aus Package auslesen Allgemeine Java-Themen 13
V Alle Klassen eines Package auflisten? Allgemeine Java-Themen 6
G jfreechart probleme mit dem package? Allgemeine Java-Themen 2
E (einfaches) Problem mit import und package (export) Allgemeine Java-Themen 4
E Was ist "default package" in Eclipse konkret? Allgemeine Java-Themen 12
M diff package? Allgemeine Java-Themen 7
T auf Klasse in Default package zugreifen Allgemeine Java-Themen 10
G externe package Allgemeine Java-Themen 7
A Package Probleme Allgemeine Java-Themen 9
J Konstruktor-Aufruf nur aus einem bestimmten Package erlauben Allgemeine Java-Themen 5
G Suche gutes Statistik Package Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
P alle Klassen in package auflisten Allgemeine Java-Themen 2
M JNI: nach verschieben in package UnsatisfiedLinkError Allgemeine Java-Themen 3
D Laaaange Klassennamen und Package-Pfade. Allgemeine Java-Themen 5
J Einbinden einer protected-Methode aus anderem Package Allgemeine Java-Themen 2
H .java Dateien in anderem Package Allgemeine Java-Themen 8
S javadoc: package problem Allgemeine Java-Themen 3
G package und classpath grundsatzfrage Allgemeine Java-Themen 7
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
T Problem: Ein Package für 2 Projekte? Allgemeine Java-Themen 3
S Problem bei Umstellung von (default package) auf Packages Allgemeine Java-Themen 10
H Package name aus Class-File auslesen Allgemeine Java-Themen 11
G Java Package Allgemeine Java-Themen 2
EagleEye klassen package problem Allgemeine Java-Themen 3
C Jakarta commons package downloaden und installieren Allgemeine Java-Themen 7
L Package und Klassenname von aufrufender Klasse holen Allgemeine Java-Themen 2
Z auf static Methode aus anderen Package zugreifen? Allgemeine Java-Themen 7
H Klassen in einem Package ermitteln Allgemeine Java-Themen 6
C Problem mit Package Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben