Interface Custom 'Event' mit Interface

Bananabert

Bekanntes Mitglied
Nabend Community,

folgendes Problem:
Ich möchte von meiner 'MenuBar' Klasse aus, nach 'actionPerformed()' eine Interface-Methode ansprechen. Anstatt in den besagten Klassen eine Methode auf Static zu stellen.

MenuBar
Java:
...
@Override
public void actionPerformed(ActionEvent e) {
	if(e.getActionCommand() == "doBarrelRoll")
		doBarrelRoll.doBarrelRoll();
}
...

Das Interface
Java:
public interface doBarrelRoll{
	public doBarrelRoll();
}

CustomClass
Java:
...
@Override
public void doBarrelRoll() {
	System.out.println("klappt");
}
...

LG Bananabert
 
Zuletzt bearbeitet:
G

Gast2

Gast
Java:
if(e.getActionCommand() == "doBarrelRoll")
Strings vergleich man per equals().
 

Bananabert

Bekanntes Mitglied
Die Klasse 'ToolBar' hat die Methode 'actionPerformed' welches die Methode 'doBarrelRoll()' in dem Interface 'doBarrelRoll' anspricht.
Und eine Custom Klasse implementiert 'doBarrelRoll'.

Entweder bin ich zu müde um das hinzubekommen, oder ich bin einfach zu müde;
 
G

Gast2

Gast
Ich sehe in deinen drei bisherigen Posts nirgendwo ein Fragezeichen. Was ist deine Frage?!
 

Bananabert

Bekanntes Mitglied
Ich sag ja, einfach zu müde.

Wie bekomme ich das ganze hin?
Ich bekomms nicht hin, das Beispiel auf mein Bedürfnis anzupassen.
 

Bananabert

Bekanntes Mitglied
Man man man,
was für ein Tag.. irgendwie geht Heute nichts.
Selbst auf der Arbeit kam ich irgendwie zu nichts ... plötzlich war meine kompletter workspace weg und musste erstmal alles neu einrichten ...

Nun denn, ich hab das Problem lösen können.


Java:
public class ToolBar implements ActionListener{

	private List<FileEvent> responder;

	public ToolBar(){
		this.responder = new ArrayList<FileEvent>();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("Neu"))
			for(FileEvent fe : responder)
				fe.newGame();
	}

	public void addActionListener(FileEvent e) {
		responder.add(e);
	}

	public interface FileEvent{
		public void saveGame();
		public void newGame();
		public void loadGame();
	}
}

Java:
public class Custom implements FileEvent{

	private ToolBar tb;
	public Custom() {
		tb = new ToolBar();
		tb.addActionListener(this);
	}

}

Letzte Frage wäre, wäre es möglich die 'List<FileEvent>', sowie 'addActionListener()' in eine eigene Klasse zu verschieben?
Zum Verwalten aller Events?
 
T

tröööt

Gast
tja ... da fehlt wohl echt einiges an wissen

1) grundlegend sollte man in java alles was mit events zu tun hat (auch NICHT-gui events) von java.util.EventObject sowie von java.util.EventListener ableiten ... das ist die sog. Event-Handling-API

2) ich verstehe überhaupt nicht was du am anfang mit "static" wolltest ...
in einem normalen projekt gibt es (abgesehen von factories / singleton und utilities) nur EIN static ... und das ist MAIN ...

3) hast du schon mal was von den "Java Coding Conventions" gehört ? das solltest du dir mal googlen .. denn deine bezeichner und klassen-namen gehen mal überhaupt nicht ...

4) es heißt "Do A Barrel Roll"

5) "public class X implements ActionListener" macht man überhaupt nicht ... oder soll deine klasse ein nach außen hin öffentlicher ActionListener sein ? ich glaube wohl kaum ... dafür nutzt man "inner anonymous classes" > google

6) entkopplung vom EDT
normalerweise steckt man den code der innerhalb von irgendwelchen Listener-methoden abläuft (gerade GUI-listener) in threads um den caller-thread nicht zu blockieren ... denn events sollten grundsätzlich a-synchron laufen ... wenn es synchron sein soll braucht man kein event .. dann callt man die methode direkt ...


die fehlen noch sehr viele grundlagen ... und du versuchst gerade merhere grundlagen-bereiche mit ein ander zu verbinden von denen dein kenntnis-stand bei jedem einzelnen bereich nicht weiter geht als : hab ich mal gehört ...

du solltest schritt-für-schritt erstmal grundlagen lernen ... und dann später wie man diese verbindet ... das was du hier machst dürfte am ende in einem einzigen haufen code-wirrwarr enden durch den keiner mehr durchblickt ...

denn alleine ein nested interface zu deklarieren ... aber dies von außen implementieren wollen ... ich weis nicht mal ob das geht ... kann es mir aber erlich gesagt nicht vorstellen ...
 

Bananabert

Bekanntes Mitglied
Hallo tröööt,

zu 1): ich hab mich dazu ein wenig belesen und es auch recht gut verstanden

zu 2): whatever :D weiß ich selbst nicht mehr

zu 3): ja habe ich, jedoch ist das ganze bei mir noch nicht ausgereift

zu 4): ja ich weiß

zu 5): soll heißen, innerclass implements ActionListener, sodass nur der eventdispatcher diese methode ansprechen kann?

zu 6): hättest du dazu ein kleines beispiel oder link zu einem beispiel?


zu grundlagen): das ist mir klar, ich bin auch nicht sehr lange dabei in java zu programmieren

zu nested interface): eigentlich hat dieses interface eine eigene datei, keine ahnung wieso es dadrin gelandet ist.
 
T

tröööt

Gast
5) nein ... so nicht direkt ... ich versuch es mal so zu erklären

wenn du an eine public class "implements WhatEver" dranhängst machst du diese klasse damit nach außen hin zu einem typ dieses interfaces ... das ist sinnvoll bei z.b. Runnable da man nicht direkt von Thread erben sollte (frag bitte nicht warum , hab dazu mal ne super erklärung gelesen die es verständlich gemacht hat) ... aber gerade bei allen Listener-interfaces aus java.awt.event sollte man das strikt vermeiden ... denn du willst deine klasse sicherlich nicht für alle anderen als z.b. einen ActionListener zur verfügung stellen ... oder ?
das macht in den wenigstens fällen sinn (eigentlich überhaupt nicht) und ist eher schlechtes design ...

es gibt natürlich auch noch ganz andere interfaces bei denen es sogar teilweise nötig ist ... aber das wäre eine andere geschichte ...

fakt ist : man sollte bei allen java.awt.event.XXXListener interfaces auf ein public implements verzichten und stattdessen mit anonymen inner classes arbeiten ... ein einfaches beispiel würde so aussehen :

Java:
JButton jButton=new JButton("Button");
jButton.add(new ActionListener() {
	public void actionPerformed(ActionEvent event)
	{
		// TO-DO
	}
});

was so , in anbetracht von 6) noch nicht so optimal ist ... aber schon deutlich besser als an die klasse oben "implements ActionListener" dran zu tackern ...
außerdem hat es den vorteil das man nicht prüfen muss von welchem element das ActionEvent ausgelöst wurde da dieser spezifische Listener nur an dem JButton hängt ... und so zumindest weis das event.getSource() dem JButton entspricht ...


6) die entkopplung vom EDT , oder generell die entkopplung des event-handlings vom event-produzierenden thread , ist in soweit wichtig da der thread welcher das event erzeugt alle an ihm registrierten listener lediglich informieren soll das ein event aufgetreten ist und dabei eventuell daten übergibt ...
bei GUI-listenern und dem EDT äußert sich dieses phänomen z.b. dadurch das wenn im listener direkt eine lange I/O-ops abläuft die GUI während dieser zeit "freezed" und man auf die abarbeitung warten muss ...
lagert man dies nun in einen extra thread aus läuft die I/O-ops im hintergrund und man kann die GUI weiterhin bedienen ... z.b. einen lade-balken anziegen ...

die einfache variante (um am beispiel von oben weiter zu machen) würde in etwa so aussehen :

Java:
JButton jButton=new JButton("Button");
jButton.add(new ActionListener() {
	public void actionPerformed(ActionEvent event)
	{
		(new Thread(new Runnable() {
			public void run()
			{
				// TO-DO
			}
		})).start();
	}
});

somit wird die aktion im listener vom EDT entkoppelt und freezed die GUI nicht während einer längeren I/O-ops ...
das ist einer der beliebtesten anfänger-fehler von leuten die neu in GUI-programmierung sind und sich dann wundern warum die GUI freezed und das ergebnis erst am ende sichtbar wird obwohl doch alles schön programmiert ist ... das sog. BLOCK des EDT ist dafür verantwortlich ... weil der EDT nicht nur die events aufnimmt und weiterleitet sondern auch für das neu-zeichnen der GUI verantwortlich ist ...

allerdings ist gerade bei swing folgendes zu beachten : GUI-veränderungen dürfen NUR vom EDT vorgenommen werden ...
wie aber macht man das jetzt korrekt ? nun .. dafür wird weiter geschachtelt :

Java:
JButton jButton=new JButton("Button");
jButton.add(new ActionListener() {
	public void actionPerformed(ActionEvent event)
	{
		(new Thread(new Runnable() {
			public void run()
			{
				SwingUtilities.invokeLater(new Runnable() {
					public void run()
					{
						// TO-DO
					}
				});
			}
		})).start();
	}
});

soll der thread noch darauf warten das der EDT die änderungen übernommen hat ersetzt man invokeLater() durch invokeAndWait() ...

genaueres dazu findet man im sun-tutorial
 

Bananabert

Bekanntes Mitglied
nabend tröööt,

danke für das kleine tutorial, sehr hilfreich :)

ein arbeitskollege der aus dem urlaub kam, konnte mir das mit custom eventlistener/eventhandler/eventinterface doch recht erklären.

wenn ich das richtig verstehe könnte ich dann in einer 'init()' einen (ich sag mal plain) 'EventHandler' initialisieren, und in die 'actionPerformed()' im 'invokedLater' Thread auf die 'EventHandler' variable zugreifen und eine methode ausführen und diese läuft dann in dem thread?

mir gefallen diese verschachtelten actionlistener nicht so ganz, nun denn, geschmackssache.

aber dennoch danke, wieder einmal massig gelernt :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Custom Icon in den Systemsymbolen Allgemeine Java-Themen 2
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
GenerationLost Input/Output Custom Serialization - hilfe bei Realisierung Allgemeine Java-Themen 8
Thallius Custom File Chooser Allgemeine Java-Themen 1
F Parser Framework/Plugin für Datei in Custom-Format Allgemeine Java-Themen 2
Tobse Input/Output Dateiformat: Serialisierung VS Custom format Allgemeine Java-Themen 6
G Key-Event-Sender Allgemeine Java-Themen 5
E Datei verschoben Event Allgemeine Java-Themen 3
D Event Sourcing umsetzen Was? Wie? Allgemeine Java-Themen 33
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
M Best Practice Alternativen für Event-Handling Allgemeine Java-Themen 3
C Zugriff auf Event felder Allgemeine Java-Themen 0
das-mo Warten auf Event Allgemeine Java-Themen 7
K Event benutzen Allgemeine Java-Themen 4
F None-GUI-Event Handling Allgemeine Java-Themen 3
D mouseMove in mouseMotionListener-Event Allgemeine Java-Themen 3
R Klasse über Button Event in anderer Klasse informieren Allgemeine Java-Themen 11
K event dispatch thread fehler. Compiler meckert nicht aber der Interpreter? Warum?? Allgemeine Java-Themen 11
A Relative Mausposition ohne Event Allgemeine Java-Themen 2
V Priorität der Event-Handlings setzen Allgemeine Java-Themen 4
algorismi int-variable Value Change event Allgemeine Java-Themen 3
slawaweis Suche Klassen für Event Managment und Time Allgemeine Java-Themen 2
B Window Closing Event Allgemeine Java-Themen 3
A Event Handler Allgemeine Java-Themen 5
H Event ähnliches System Allgemeine Java-Themen 20
G XML Event --> Befüllen einer Node Allgemeine Java-Themen 2
Q Dateizugriff mitbekommen - file change event Allgemeine Java-Themen 13
W eigene event-Klasse, event posten Allgemeine Java-Themen 2
M Speichern von Word als Event abfangen Allgemeine Java-Themen 7
P Event-Handling mit JSP Allgemeine Java-Themen 7
MQue public void serialEvent(SerialPortEvent event) Allgemeine Java-Themen 4
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
MQue Button Event beim drücken und beim auslassen Allgemeine Java-Themen 7
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
E Button: Event auslösen Allgemeine Java-Themen 7
B event kunstlich auslösen Allgemeine Java-Themen 8
R Dasselbe Event zweimal aufgefangen? Allgemeine Java-Themen 10
D Thread durch Mouse-Event beenden Allgemeine Java-Themen 5
I Listener/Event selber machen. Allgemeine Java-Themen 4
S methode stoppen / auf ein event warten Allgemeine Java-Themen 5
G Key Event Allgemeine Java-Themen 2
B Thread soll auf Event warten, dann Daten an Klasse senden Allgemeine Java-Themen 2
G konsolenanwendung durch key event beenden Allgemeine Java-Themen 4
M Event Queues in Java? Allgemeine Java-Themen 10
G Problem Canvas Mouse Event Allgemeine Java-Themen 7
J ToolTipText Event abfangen Allgemeine Java-Themen 5
A Endlosschleife + Event Allgemeine Java-Themen 7
G EHM EVENT handling ? Allgemeine Java-Themen 5
C Menü & event Allgemeine Java-Themen 4
C event weiterreichen Allgemeine Java-Themen 3
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
OnDemand Interface imlementieren Allgemeine Java-Themen 4
Buroto Interface Allgemeine Java-Themen 2
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
B JaxB und @XmlIDREF mit Interface Allgemeine Java-Themen 1
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
Kirby.exe Autocloseable Interface Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
mrBrown Namensfindung Fluent-Interface Allgemeine Java-Themen 0
J Logik in Interface Allgemeine Java-Themen 2
N Best Practice Allgemeines Verhalten für ein Interface implementieren? Allgemeine Java-Themen 7
B eigenes Consumer Interface Allgemeine Java-Themen 0
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
N GUI Interface, swing Allgemeine Java-Themen 7
Thallius Konzeptproblem User-Interface Allgemeine Java-Themen 5
T Interface vs abstract Allgemeine Java-Themen 2
S Klassen Abstract, Interface und ein Chat Tool Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
N Problem mit Generics und Interface Allgemeine Java-Themen 4
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface einer Library implementieren Allgemeine Java-Themen 3
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
J Interface Serializable Methodensignatur Allgemeine Java-Themen 2
J Interface Interface für Framework verwenden Allgemeine Java-Themen 4
F Interface IInterface oder Interface? Allgemeine Java-Themen 3
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
T Interface Probleme Allgemeine Java-Themen 8
M Queues und Queue Interface Allgemeine Java-Themen 3
I Mehrfaches Implementieren eines generischen Interface Allgemeine Java-Themen 9
W Java Native Interface und "mp3player" Allgemeine Java-Themen 3
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
P Eclipse Java Native Interface-Problem Allgemeine Java-Themen 8
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
pg1337 Interface-Frage Allgemeine Java-Themen 24
S Interface Welchen Interface Stil favorisiert ihr? (usability) Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben