Dungo Geschrieben 8. Juli 2010 Geschrieben 8. Juli 2010 Ich habe folgendes Problem Es gibt ein grosses Programm, wo der Anwender Neues hinzufügen kann oder Änderungen vornehemen kann. Dies geschiet mit drücken der "save" Taste, dort wird dann ein Event abgesetzt. Klassen (Ev_Kl_1 und Ev_Kl_2). Ich abstrahire von das ganze Rest, muss jedes mal wenn der Anwender "save" drückt ein Feedback ausgeben. Im Prinzip sollte es so funktionieren: import javax.swing.*; import java.awt.Graphics; import java.awt.Image; import java.awt.event.*; import java.awt.image.ImageObserver; public class fensterTest2 implements ActionListener{ JButton button; private int anzahlLocClicks = 10; private int anzahlGlobalClicks = 10; private int prozentAnzeige; public static void main(String args[]){ fensterTest2 gui = new fensterTest2(); gui.startEvent(); } public void startEvent(){ JFrame displayFenster = new JFrame(); // hier definiere ich mein fenster, unten die eigenschaften button = new JButton("Start Mein Event"); button.addActionListener(this); //registriere bei Button, werde in Liste aufgenommen -> // Argument MUSS objekt Klasse die ActionListener implementiert displayFenster.getContentPane().add(button); displayFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); displayFenster.setSize(600,300); displayFenster.setVisible(true); } public void actionPerformed(ActionEvent event){ // hier gibt aus was passiert wenn event eingetretten button.setText("Du bist "+ prozentAnzeige + "% BESSER als der Rest!!!!"); prozentAnzeige = (anzahlLocClicks*100)/anzahlGlobalClicks; anzahlLocClicks++; anzahlGlobalClicks = anzahlGlobalClicks+3; button.revalidate(); //hier kann ich noch mal klicken ... } } Ich möchte dass wenn ein Event eingetretten ist, die zwei Variablen erhöht werden UND dass ein Feedback in Fenster ausgegeben wird. Feedback wenn möglich aus einer Klasse, damit später dieses den Wünschen angepasst werden kann. Bis jetzt habe ich es so implementiert, mit dummy variablen und ohne Fenster. Klassen a) Interfaces a1)Observer Interface: public interface FeedbackObserver{ public void update (int anzahlLocClicks, int anzahlGlobalClicks); } ___________________ a2) feedback Simulator Interface public interface FeedbackSimulatorInterface { public void registerFeedbackObserver(FeedbackObserver FB); public void removeFeedbackObserver(FeedbackObserver FB); public void notifyFeedbackObservers(); } ___________________ a3) feedback Anzeige Interface public interface ShowFeedback { public void feedback(); } ___________________ Observer: public interface FeedbackObserver{ public void update (int anzahlLocClicks, int anzahlGlobalClicks); } ___________________ Simulation von der Eigentlicher Klasse wo das Event eintritt PROBLEM: EVENT IMPLEMENTIEREN welches Fenster aufruft UND Variablen updatet. import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; import javax.swing.*; import javax.swing.JButton; import javax.swing.JFrame; public class FeedbackSimulator implements FeedbackSimulatorInterface{ private ArrayList observerListe; private int anzahlGlobalClicks; private int anzahlLocClicks; public FeedbackSimulator(){ observerListe = new ArrayList(); } /*jetzt gibt es die Observer registrierer */ public void registerFeedbackObserver(FeedbackObserver FB){ observerListe.add(FB); } public void removeFeedbackObserver(FeedbackObserver FB){ // observer löschen int delObs = observerListe.indexOf(FB); if (delObs >= 0) {observerListe.remove(FB);} } public void notifyFeedbackObservers(){ for (int delObs = 0; delObs < observerListe.size(); delObs++ ){ FeedbackObserver konkretesObserver = (FeedbackObserver)observerListe.get(delObs); konkretesObserver.update(anzahlLocClicks, anzahlLocClicks); } } public void eventEingetretten() { // hier nur um Event zu simulieren, später an den Richtigen Event dranhängen anzahlLocClicks = anzahlLocClicks++; anzahlLocClicks = anzahlLocClicks+3; notifyFeedbackObservers(); } public void variablenTest(int anzahlLocClicks, int anzahlGlobalClicks){ // zum Testen wenn unsere zwei Variablen // anzahlGlobalClicks / anzahlLocClicks geändert wurden this.anzahlLocClicks = anzahlLocClicks; this.anzahlGlobalClicks = anzahlGlobalClicks; eventEingetretten(); } } ___________________ Testklasse um zu sehen ob der Feeback funktioniert, geht leider nur mit Dummy Variablen von Hand eingegeben. /*import javax.swing.*; import java.awt.Frame; import java.awt.event.*; public class feedbackTester { public static void main(String args[]){ FeedbackSimulator feedbackSimulator = new FeedbackSimulator(); ShowFeedbackHistory feedbackHistory = new ShowFeedbackHistory(feedbackSimulator); ShowFeedbackGratitude feedbackGratitude = new ShowFeedbackGratitude(feedbackSimulator); ShowFeedbackRelative1 feedbackRelative1 = new ShowFeedbackRelative1(feedbackSimulator); //hier paar testwerte das müsste der Hauptprogram liefern feedbackSimulator.variablenTest(17,17); try { Thread.sleep(1000); // 1000 milisekunden pause } catch(InterruptedException e){ } feedbackSimulator.variablenTest(10,100); try { Thread.sleep(1000); // 1000 milisekunden pause } catch(InterruptedException e){ } feedbackSimulator.variablenTest(20,75); try { Thread.sleep(1000); // 1000 milisekunden pause } catch(InterruptedException e){ } feedbackSimulator.variablenTest(30,100); } } FRAGE: wo und wie muss ich mein Event schreiben (klick event), und wie bekomme ich das Fenster hin. Hoffe es ist nicht zu kompliziert vormuliert um mein Anliegen zu verstehen. Danke schon in Voraus für Hilfe, Ideen, Vorschläge .... Zitieren
Dungo Geschrieben 8. Juli 2010 Autor Geschrieben 8. Juli 2010 Hier noch mal die Skizze wie ich mir das ganze vorgestellt habe, bei den Fragezeichen war ich nicht sicher ob nötig oder nicht: Zitieren
flashpixx Geschrieben 8. Juli 2010 Geschrieben 8. Juli 2010 Ich hoffe ich verstehe das Problem richtig (die Uhrzeit ist schuld): Also Du willst, eine Art Even-Cascade, d.h. ein Objekt generiert ein Event und daraus werden z.B. wieder 2 neue Events generiert? Also ein Event ist ja unterm Strich nichts anderes als ein "definierter" Methodenaufruf. Wenn ich das so richtig verstehe würde ich einfach eine weitere Schicht dazwischen legen, d.h. jedes Objekt registriert sich an einem Eventlistener (das ist ein Objekt was einfach eine Liste an Objekten führt, die es benachrichtigen soll). Wenn Du nun ein Event auslöst, dann löst Du das nicht direkt aus, sondern Du löst das Event Deines Eventlisteners aus, d.h. für einen Button muss der Eventlistener eben das ActionPerform implementieren. Der Eventlistener kennt aber auch alle Objekte die er zu benachrichtigen hat, d.h. Du würdest in dem ActenPerform des Eventlistener eben alle Objekte durchlaufen und von diesen die entsprechend implementierte Methode aufrufen. Das ganze lässt sich natürlich noch feiner gestalten, also so aber mal das Konzept HTH Zitieren
Dungo Geschrieben 8. Juli 2010 Autor Geschrieben 8. Juli 2010 Erst mal Vielen Dank für Deine Hilfe !! An sich ist es richtig, wenn das Event ausgelöst wird "save" Knopf drücken, sollten a) meine Variablen up-gedated werden ein Fenster aufgerufen werden welches Feedback anzeigt Habe ich es richtig verstanden? Der Hauptevent "save" (mein KlickEvent) ruft den Eventlistener auf, dieser löst ein weiteres Event aus? Von meiner Skizze ausgehend, kann ich den Observer 2 weg lassen Dann zwei Klassen, mit Variablen-update und Feedback-aufruf Methoden bei den Eventlistener (~Observer?) registrieren ... bis hier komme ich noch mit dann Wenn Du nun ein Event auslöst, dann löst Du das nicht direkt aus, sondern Du löst das Event Deines Eventlisteners aus, d.h. für einen Button muss der Eventlistener eben das ActionPerform implementieren. welches ist dann das Event meines Eventlisteners ... da komme ich nicht mehr ganz mit ... Zitieren
flashpixx Geschrieben 8. Juli 2010 Geschrieben 8. Juli 2010 Der Hauptevent "save" (mein KlickEvent) ruft den Eventlistener auf, dieser löst ein weiteres Event aus? Ja, ich habe das so unter Java noch nicht realisiert, sondern nur unter C++ / Qt mit Signal-Slot-Mechanismen. Ist aber vom Prinzip her identisch. welches ist dann das Event meines Eventlisteners ... da komme ich nicht mehr ganz mit ... Natürlich, denn Du musst es ja implementieren. Am meinem Beispiel: Ich hatte eine Clusteranwendung geschrieben, d.h. ich muss ja irgendwie mit den Tasks auf anderen Rechnern kommunizieren. Das Problem ist, dass die Tasks auf dem Core völlig unabhängig laufen, sofern ich nicht selbst dafür sorge, dass sie synchronisieren. Vom Prinzip funktioniert es dann so: Sobald das Programm startet werden Singleton Objekte erzeugt, die zentral alle Events verarbeiten. Sie dienen nur dazu, dass eben ein Objekt ein Event auslösen kann und das Singelton Objekt reicht die Nachricht weiter. Für ein konkretes Objekt sieht das dann so aus, dass es im Konstruktor sich in dem statischen Eventhandler anmeldet und im Destruktor wieder abmeldet. Wenn das Objekt nun ein Event auslöst, ruft es entsprechend die Methode des Eventhandlers auf, dieser ruft dann wiederum die Methoden der registrierten Objekte auf. Jedes Objekt, das sich am Handler registriert, muss eben passende Methoden implementieren und man muss bei der Registrierung dem Eventhandler natürlich eine Referenz auf das jeweilige Objekt mitgeben. Ich halte die Eventhandler statisch, da sie nur einmalig vorhanden sein sollen. Natürlich könnte man auch einzelne Objekte erzeugen, das macht es aber viel aufwändiger und fehleranfälliger. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.