Zum Inhalt springen

Events


Dungo

Empfohlene Beiträge

Ich habe folgendes Problem

java_idee.gif

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 ....

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

B) 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 ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...