Erste Versuche eine Art "EventHandler" zu bauen..

oOJavaNeulingOo

Bekanntes Mitglied
Guten Abend!

Ich habe mal ein bisschen versucht eine Art EventHandler zu bauen.
Leider schließt sich das Programm sofort noch dem start, ohne etwas auszugeben...

Code:
Java:
public static void main(String[] args) {
		new Converter(); //Command #1
		new TestHandler().start();
	}
	
	/**
	 * Registriere einen Befehl
	 * @param c - Die Command-Klasse
	 */
	public void registerCommand(Command c){
		commands.add(c);
	}
	
	/**
	 * Starten des Programmes
	 */
	private void start(){
		try{
			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
			for(Command c : commands){
				c.onCommand(reader.readLine());
			}
			reader.close();
		}catch(Exception e){
			
		}
	}	
	private ArrayList<Command> commands = new ArrayList<Command>();
Command:
Java:
public class Command {
	
	public void onCommand(String cmd){
		
	}

}

ODER

public interface Command {
	
	public void onCommand(String cmd);

}

Converter:
Java:
public class Converter extends Command{

	@Override
	public void onCommand(String cmd) {
		System.out.println(cmd);
		
	}
public Converter(){
		new TestHandler().registerCommand(this);
	}
}

ODER

public class Converter implements Command{

	public void onCommand(String cmd) {
		System.out.println(cmd);
		
	}

	
	public Converter(){
		new TestHandler().registerCommand(this);
	}
}

Funktioniert alles nicht..
 
Ich würde sagen, benutze die Interface Veriante. Der Fehler ist, dass du den Converter zu einer neuen Instanz von TestHandler hinzufügst. Du musst all Command Objekte beim selben TestHandler registrieren.
Also ungefähr so
Java:
public static void main(String[] args) {
        TestHandler handler = new TestHandler();
        handler.registerCommand(new Converter());
        handler().start();
    }

Und im Converter kannst du dann den Konstruktor weglassen.
Und dann ist da noch ein zweiter Fehler
Java:
for(Command c : commands){
                c.onCommand(reader.readLine());
            }
Sollte wahrscheinlich geändert werden in
Java:
String line = reader.readLine();
for(Command c : commands){
                c.onCommand(line);
            }
 
Vielen Dank, ich probiere es sofort aus!

EDIT: Es funktioniert *_*!! Vielen Dank 😀!

Btw, war mein Anlauf mit der ArrayList und dem Interface denn überhaupt akzeptabel, oder macht man das normalerweise ganz anders?
 
Zuletzt bearbeitet:
ArrayList plus Interface ist die übliche Methode EventHandler zu implementieren.
Die EventListener in den java swing Klassen benutzen das selbe Prinzip.
 
Okay, vielen Dank!

Eine letzte Frage: Nachdem ich die Startmethode ausgeführt habe, und alle Commands benutzt habe, will ich die Methode nochmal usführen - Quasi als unendlicher Schaltkreis, allerdings kriege ich dann fehler..
 
UUuuund nochwas: Wie kann ich eine Art Priorität setzen? Muss ich dafür wirklich ein Enum erstellen und die ArrayList zu einer HashMap erweitern D: ? Die Priorität soll angeben was als erstes ausgeführt werden soll und was als letztes und so :/ so dass der exit command die höchste priorität hat zb
 
Naja, "CommandHandler" ist ja einfach.. Aber wie baue ich einen EventHandler?

zB habe ich irgendwo im Code einen Code, welcher ein Objekt bewegt, doch statt es zu bewegen ruft es alle Klassen die ein @EventHandler über einer Methode - naürlich registriert (die klasse) - und ein zB MoveEvent in den argumenten haben auf.. Und MoveEvent beihnhaltet dann das was eig. bewegen soll.. Egal, wie mache ich einen EventHandler?
 

Zurück
Oben