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.
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);
}
}
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);
}
ArrayList plus Interface ist die übliche Methode EventHandler zu implementieren.
Die EventListener in den java swing Klassen benutzen das selbe Prinzip.
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?