Event in Fenster ausgeben + Observer + kein Plan

Testklasse schreiben bevor eigentliche Klasse geschrieben?

  • Ja, da kann man gleich seine Impelementierung überprüfen.

    Stimmen: 1 100,0%
  • Nein, lieber danach eine Testklasse schreiben.

    Stimmen: 0 0,0%

  • Anzahl der Umfrageteilnehmer
    1

Dungo

Mitglied
Habe ein Projekt wo ich nicht so gut weiter komme wie gedacht, daher wollte ich erst mal die Einfache Version davon zu laufen bekommen bevor ich mich zu dem Erweiterungen wage.
http://www.java-forum.org/awt-swing-swt/102232-feedback-fenster-ausgeben.html#post651764

In zwei verschiedenen Klassen wird das selbe Event abgesetzt (Anwender drückt "speichern" Taste nachdem er was geschriben / geändert. Meine Aufgabe ist ein Feedback zu schreiben.

Ich habe zwei Variablen die jedes Mal wenn das Event eintritt um eins erhöht werden.
Meine "geänderte" Idee / Konzept.
Wenn das Event eingetretten ist die Variablen um eins erhöhen, dann denn Beobachter benachrichtigen um ein Feedback in Fenster auszugeben.

Zur veranschaulichen, wie in der Bsp. Klasse hier aber ....

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{ //Interface von ActionListener implementiert
//
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();

button = new JButton("Start Mein Event");

button.addActionListener(this);
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();
}


}

_____________________________________________________________
Ich möchte die Anzeige von button.setText("Du bist "+ prozentAnzeige + "% BESSER als der Rest!!!!"); aus eine Andere Klasse importieren lassen wie z.B. (noch mal meine alte) Feedback Klasse:

Ich muss dann noch ein Beobachter implementieren welcher aufgerufen wird wenn sich die Werte der anzahlLocClicks, anzahlGlobalClicks Variablen ändern ? oder bin ich jetzt total daneben ???

Die Tipps von der Ersten Posting (s.o.) waren einleuchten, aber irgendwie bin ich nich weiter gekommen .... habe den Eindruck dass ich den Wald von lauter Bäume nicht sehen kann ??? :bahnhof::L
_____________________________________________________________

public class ShowFeedbackRelative1 implements ShowFeedback, FeedbackObserver {

private int anzahlLocClicks;
private int anzahlGlobalClicks;
private FeedbackSimulatorInterface feedbackSimulator;

public ShowFeedbackRelative1(FeedbackSimulatorInterface feedbackSimulator){
this.feedbackSimulator = feedbackSimulator;
feedbackSimulator.registerFeedbackObserver(this);
}


public void update(int anzahlLocClicks, int anzahlGlobalClicks ){
this.anzahlLocClicks = anzahlLocClicks;
this.anzahlGlobalClicks = anzahlGlobalClicks;
feedback();
}

public void feedback(){
int relativeBeiträge;
relativeBeiträge = (anzahlLocClicks * 100) / anzahlGlobalClicks;
System.out.println("Vielen Dank, sie haben mehr Beiträge als " + relativeBeiträge+ "% der Teilnehmer");
}
}
 
Ich möchte die Anzeige von button.setText("Du bist "+ prozentAnzeige + "% BESSER als der Rest!!!!"); aus eine Andere Klasse importieren lassen

Versuch's mal so:
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class FensterTest3 implements ActionListener, Observer {

    private final JButton button1, button2;
    private final Controller controller;

    public FensterTest3() {
        controller = new Controller(this);
        JFrame displayFenster = new JFrame("FensterTest3");
        displayFenster.setLayout(new FlowLayout());
        button1 = new JButton("Mein Event 1");
        button2 = new JButton("Mein Event 2");
        button1.addActionListener(this);
        button2.addActionListener(this);
        displayFenster.getContentPane().add(button1);
        displayFenster.getContentPane().add(button2);
        displayFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        displayFenster.setSize(600, 300);
        displayFenster.setLocationRelativeTo(null);
        displayFenster.setVisible(true);

    }

    public void actionPerformed(final ActionEvent event) {
        controller.addClicks(event.getSource(), 1);
    }

    public static void main(final String args[]) {
        Runnable gui = new Runnable() {

            public void run() {
                new FensterTest3();
            }
        };
        //GUI must start an EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }

    public void update(final Observable o, final Object arg) {
        Clicks clicks = (Clicks) arg;
        button1.setText("Du bist " + clicks.getProzent(button1) + "% BESSER als der Rest!!!!");
        clicks.getProzent(button2);
        button2.setText("Du bist " + clicks.getProzent(button2) + "% BESSER als der Rest!!!!");
    }
}

class Clicks extends Observable {

    private int anzahlGlobalClicks;
    private final Map<Object, Integer> localClicks;

    public Clicks() {
        localClicks = new HashMap<Object, Integer>();
    }

    public void addClicks(final Object object, final int count) {
        anzahlGlobalClicks += count;
        Integer clicks = 0;
        if (localClicks.containsKey(object)) {
            clicks = localClicks.get(object);
        }
        localClicks.put(object, clicks + count);
        setChanged();
        notifyObservers(this);
    }

    public int getProzent(final Object object) {
        int anzahlLocalClicks = 0;
        if (localClicks.containsKey(object)) {
            anzahlLocalClicks = localClicks.get(object);
        }
        return (anzahlLocalClicks * 100) / anzahlGlobalClicks;

    }

    @Override
    public String toString() {
        Set<Object> keySet = localClicks.keySet();
        String str = "";
        for (Object key : keySet) {
            str += localClicks.get(key);
            str += " ";
        }
        return "anzahlGlobalClicks=" + anzahlGlobalClicks + ", localClicks=" + str;
    }
}

class Controller {

    private Clicks clicks;

    public Controller(final Observer observer) {
        clicks = new Clicks();
        clicks.addObserver(observer);
    }

    public void addClicks(final Object object, final int count) {
        clicks.addClicks(object, count);
    }
}
 
Zuletzt bearbeitet:
Hallo André, Danke für Deine Hilfe.

Ich glaube mein Hauptproblem ist immer noch dass ich mich zu umständlich ausdrucke ..
Hier noch mal meine Problem als Diagramm:

java_idee.gif


Im Hauptprogramm eine Webanwendung, fügen die Anwender neue Inhalte hinzu oder setzen Relationen zwischen den gespeicherten Inhalten. Sobald der Anwender fertig ist, wird die Arbeit gespeichert ("save" Knopf gedrückt). Beim speichern (Anwender klickt auf "save") wird ein Event ausgelöst, dies ist an zwei Stellen möglich, in zwei unterschiedlichen Klassen entweder in der Ev_Kl_1 oder in der Ev_Kl_2 Klasse. Dies ist davon abhängig wo der Anwender gerade gearbeitet hat. (Inhalte hinzufügen Ev_Kl_1, Relationen setezen Ev_Kl_2)

Meine Aufgabe ist es, jedes mal wenn der Anwender den"save" Knopf drückt ein Feedback auszugeben.

Meine Idee:
- mich nur um die zwei Events kümmern, von dem Rest von der Programm abstrahieren
- an den beiden Events ein Observer anhängen (darf es dasselbe sein?)
- dieser ruft eine Methode auf welcher die beiden Variablen anzahlGlobalClicks und anzahlLocalClicks
erhöht.
- Danach wird ein Feedback in (neues?) Fenster Ausgegben.
Es gibt mehreren Feebacks, welche über ein Feedback Interface aufgerufen werden. (es sollte später Möglich sein die Feebacks zu ändern oder neue hinzu zu fügen).

Habe versucht nach der Skizze den Programm zu schreiben (Dateien in Anhang, Rest hier da maximal 5 Dateien zu hochladen erlaubt):

Feeback Klassen:

Java:
public class ShowFeedbackRelative1 implements ShowFeedback, FeedbackObserver {
	
	private int anzahlLocClicks;
	private int anzahlGlobalClicks;
	private FeedbackSimulatorInterface feedbackSimulator;

	public ShowFeedbackRelative1(FeedbackSimulatorInterface feedbackSimulator){
		this.feedbackSimulator = feedbackSimulator;
		feedbackSimulator.registerFeedbackObserver(this);
	}
	
	
	public void update(int anzahlLocClicks, int anzahlGlobalClicks ){
		this.anzahlLocClicks = anzahlLocClicks;
		this.anzahlGlobalClicks = anzahlGlobalClicks;
		feedback();
	}
	
	public void feedback(){
		int relativeBeiträge;
		relativeBeiträge = (anzahlLocClicks * 100) / anzahlGlobalClicks;
		System.out.println("Vielen Dank, sie haben mehr Beiträge als " + relativeBeiträge+ "% der Teilnehmer");				
	}
}

Java:
public class ShowFeedbackHistory implements ShowFeedback, FeedbackObserver{
	
	private int anzahlLocClicks;
	private int anzahlGlobalClicks;
	private FeedbackSimulatorInterface feedbackSimulator;
	
	public ShowFeedbackHistory(FeedbackSimulatorInterface feedbackSimulator){
		this.feedbackSimulator = feedbackSimulator;
		feedbackSimulator.registerFeedbackObserver(this);
	}
	
		public void update(int anzahlLocClicks, int anzahlGlobalClicks){
		this.anzahlLocClicks = anzahlLocClicks;
		feedback();
	}
	public void feedback(){
		System.out.println("Vielen Dank, Sie haben bereits " + anzahlLocClicks + " Beiträge");
	}
		
	
}

.....

Falls ich keinen Denkfehler bezüglich der realisierung gemacht habe, sind zur Zeit dies meine Probleme:

wo muss mein Fenster hin, in der FeedbackSimulator oder feedbackTester Klasse?
muss ich für den Update der Variablen eine extra Klasse hinschreiben?

Am Ende sollte es so aussehen oder zumindest ählich wie in der fensterTest2.java Klasse.

Viele Dank auch für die bisherige Hilfe !
 

Anhänge

Zuletzt bearbeitet:

Neue Themen


Zurück
Oben