Observer Pattern - hasChanged() immer false

Helgon

Bekanntes Mitglied
Hey, ich hab folgendes Problem. Mein Subjekt gibt immer zurück, dass das flag das von setChanged() gesetzt wird false sei.

Java:
public class Main implements Observer {

    public static void main(String[] args) {
    	
    	final MainFrame frame = new MainFrame();
    	frame.main(null);
    	
    	Thread t = new Thread(){
    		
    		@Override public void run(){
    			
    			while(true){
    				if(frame.teller.hasChanged()){
    					System.out.println("x");
    
            // [...........]
    
}

Java:
	public void addProgress(Object object){
		setChanged();
		notifyObservers(object);
	}

Das Subjekt und die Observer werden in der Instanz von MainFrame erzeugt. (Das funktioniert auch alles richtig)

Ich möchte aber, dass wen die Observer benachrichtigt werden (in MainFrame wurde ein Button Event ausgelöst) ich das auch in der Klasse Main weis, um von dort aus mit dem Wert einer TextBox eine neue Klasse zu erzeugen.

Ich muss ja aber wissen, wann der Button gedrückt wurde und das müsste doch der Moment sein wo setChaged()==true sein müsste, oder etwa nicht? Nur bei mir ist das nie der Fall? Ist der Moment vllt zu kurz und der Thread bekommt es nicht mit?

Wenn ja, wie kann ich das Problem sonst lösen?

Grüße
 

Helgon

Bekanntes Mitglied
Alles klar, ich wollts übersichtlich halten :D - Eigentlich gibts ja kein "fehlerhaftes Verhalten". Alles läuft wie es soll, nur die Flag scheint nie gesetzt zu sein (was sie aber natürlich wird)

Java:
 public static void main(String[] args) {
    	
    	final MainFrame frame = new MainFrame();
    	frame.main(null);
    	Thread t = new Thread(){
    		@Override public void run(){   			
    			while(true){
    				if(frame.teller.hasChanged()){
    					System.out.print("x");
    				}
    			}  			
    		}   		
    	};    	
    	t.start();   	
    }  
}

Java:
package isbnreader;

import java.util.Observable;

import javax.swing.JProgressBar;

public class ProgressTeller extends Observable {
	
	public void addProgress(Object object){
		setChanged();                          /// Wenn das Erzähler Subjekt die Methode addProgres(Obj o) aufruft, dann müsste die Flag durch kurzeitig gesetzt werden, sodass hasChanged() == true ist
		notifyObservers(object);            /// hier wird die flag dann ja nach dem benachrichtigen auf false wieder gesetzt
	}

}

Java:
import java.util.Observable;

public class ProgressListener implements Observer {

	final private String name;
	ProgressListener(String name){this.name = name;}
	
	@Override
	public void update(Observable o, Object arg) {
		try {((JProgressBar) arg).setValue(((JProgressBar) arg).getValue()+20);} 
                catch(ClassCastException e) {e.printStackTrace();}
	}
}

Java:
package isbnreader;
import java.awt.Label;
import java.util.Observer;

import javax.swing.*;

public class MainFrame extends JFrame {
	
     private JProgressBar jProgressBar1;
     
     ProgressTeller teller = new ProgressTeller();
	 ProgressListener listener1  = new ProgressListener("lis1");
     
    public MainFrame() {
    	initComponents();
    	teller.addObserver(listener1);
    }
    
    public  void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {	
		teller.addProgress(jProgressBar1);
	}
	
    public static void main(String args[]) {		     	    
	        java.awt.EventQueue.invokeLater(new Runnable() {
	            public void run() {
	                new MainFrame().setVisible(true);
	            }
	        });        
	  }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    public  void initComponents() {
    	
         jProgressBar1 = new JProgressBar();

        jButton1.setText("Suchen");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

 
        pack();
    }// </editor-fold>//GEN-END:initComponents

    public JProgressBar getBar(){
    	return jProgressBar1;
    }
    
}

Ka, wie ich ein KSKB kleiner verpacken kann, sry :(

Aber hoffe es hilft damit mir wer helfen kann. Wie gesagt funktionieren tut alles, nur ich würd gern wissen wie ich auch Klassenübergreifend benachrichtigt werden kann (um dann weitere AKtionen auszuführen)

Grüße

P.S.: Siehe Kommentare 2ter Code Block
 

Michael...

Top Contributor
Java:
     	Thread t = new Thread(){
    		@Override public void run(){   			
    			while(true){
    				if(frame.teller.hasChanged()){
    					System.out.print("x");
    				}
    			}  			
    		}   		
    	};    	
    	t.start();
Das ist schonmal nichts. Der Thread läuft die ganze Zeit und belastet Deine CPU zu 100%. Ausserdem ist das Oberver Pattern ja nicht dafür da, um ständig ein Objekt zu fragen, ob es was neues gibt. Sondern, damit das Objekt aktiv mitteilen kann, dass sich etwas geändert hat.
Ich weiß zwar nicht, was das werden soll, aber momentan reicht für die Lösung Deiner Anforderung ein simpler Listener.

Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class ProgressBarDemo extends JPanel {
	private JProgressBar progressBar;
	
	public ProgressBarDemo() {
		JButton button = new JButton("Suchen");
		this.setLayout(new GridLayout(2,1, 10, 10));
		this.add(progressBar = new JProgressBar());
		this.add(button);
		
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				progressBar.setValue(progressBar.getValue() +20);
			}
		});
	}
	
	public static void main(String[] s) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new ProgressBarDemo());
		frame.pack();
		frame.setVisible(true);
	}
}
 

Helgon

Bekanntes Mitglied
Hey, danke für die Antwort und das du dir die Mühe gemacht hast den Code zu schreiben, aber ich glaub du verstehst nicht ganz worauf ich hinaus will :)

Hast natürlich recht, dumm den Thread da ganze Zeit laufen zu lassen, aber ich wusst mir leider nicht anders zu helfen (und war ja nurn Test).

Wie du es geschrieben hast, ist es mir natürlich klar, aber wenn ich in
Code:
KlasseA
ein Objekt von
Code:
KlasseB
erzeuge und der Button/der EventHandler sich in
Code:
KlasseB
befindet. Wie bekommt das
Code:
KlasseA
mit? Sagen wir Beispielsweise soll dann in
Code:
KlasseA
ein Objekt von
Code:
KlasseC
erzeugt werden.

Da hab ichs ja mit dem Observer Pattern probiert.

Grüße

Hoffe du weißt was ich meine, ansonsten bitte frag und ich versuchs nochmal zu erklären :)
 
B

bygones

Gast
brute-force:
Java:
public class KlasseA {
 public void foo() {
     klasseB b = new KlasseB(this);
 }

 public void createC() {
    // was auch immer
 }
}

public class KlasseB {
  private final KlasseA a;
  
  public KlasseB(KlasseA a){
    this.a = a;
  }

  public void bar() {
    // irgendwas
    a.createC();
 }
}
also eine Art Callback Mechanismus. Brute-force deswegen, da KlasseB KlasseA direkt kennt. Schoener ist es, wenn KlasseA ein Interface Implementiert (zb einen Listener) und KlasseB nur das Interface kennt.

Das sollte dann aber auch mit dem Observer Pattern gehen - oder jeglichen Listener Interface das man selbst baut
 

Helgon

Bekanntes Mitglied
Danke für die Antwort. Diesen "Brute-Force" Weg hatte ich auch schon ausprobiert, aber der erschien mir zu unsauber :D

And Interfaces hab ich gar nicht gedacht. Werd mal gucken ob ich da was hinkrieg. Danke für die Idee! :)
 
B

bygones

Gast
Danke für die Antwort. Diesen "Brute-Force" Weg hatte ich auch schon ausprobiert, aber der erschien mir zu unsauber :D
ist es eigentlich auch, da sehr unflexibel

Aehnlich wie bei MouseListener, ActionListener etc sollte man ein Interface definieren, dass auf gewisse Aktionen reagiert. Bei dir dann ist die KlasseB der Halter aller Listener und kann neue aufnehmen bzw wenn noetig, welche entfernen.

Wenn dann das Ereignis eintritt, benachrichtigt KlasseB alle seine Listener.
 

Michael...

Top Contributor
Bin ja nicht gerade Fan des Observer Patterns und von den in der Java API implementierten Klassen.

Ich würde sowas mit einem Listener implementieren. Der Einfachheit halber hier ein Bsp. mit ActionListener. Es könnte natürlich auch ein beliebiger selbst definierter Listener sein:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DemoListener {
	
	class KlasseA extends JPanel implements ActionListener {
		private JLabel label;
		private KlasseB klasseB;
		
		public KlasseA() {
			this.setLayout(new GridLayout(2,1));
			klasseB = new KlasseB();
			klasseB.registerListener(this);
			label = new JLabel("Push the button!!");
			this.add(klasseB);
			this.add(label);
		}
		
		public void actionPerformed(ActionEvent e) {
			KlasseC klasseC = new KlasseC();
			System.out.println("new object created: " + klasseC);
			label.setText(klasseC.toString());
		}
	}
	
	class KlasseB extends JPanel {
		private JButton button;
		
		public KlasseB() {
			this.setLayout(new GridLayout(1, 1));
			this.add(button = new JButton("Suchen"));
		}
		
		public void registerListener(ActionListener listener) {
			button.addActionListener(listener);
		}
	}
	
	class KlasseC {
		public String toString() {
			return "Ich bin ein Objekt vom Typ " + this.getClass().getSimpleName();
		}
	}
	
	public void starteDemo() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new KlasseA());
		frame.setBounds(50, 50, 300, 80);
		frame.setVisible(true);
	}
	
	public static void main(String[] s) {
		new DemoListener().starteDemo();
	}
}
 

Helgon

Bekanntes Mitglied
Ich wollt grad wieder schon ne Frage Posten, aber da hab ich den Post von dir gesehn (Michael).

Das ist glaub ich ca. was ich umsetzen wollte, bin ich aber nicht drauf gekommen.

Werds mir dann gleich mal ganz genau zu Gemüte führen und schauen das ichs dann bei mir auch so umsetzen kann.

Vielen Dank euch beiden auf jeden Fall.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
K Observer Pattern notifyObservers Java Basics - Anfänger-Themen 9
W Observer-Pattern Java Basics - Anfänger-Themen 3
T Verständnisfrage Observer-Pattern Java Basics - Anfänger-Themen 8
S Observer Pattern notifyObserver Java Basics - Anfänger-Themen 6
M Observer Pattern Java Basics - Anfänger-Themen 14
A MVC Observer Pattern Java Basics - Anfänger-Themen 2
Y Observer update Java Basics - Anfänger-Themen 3
N Observer funktioniert nicht Java Basics - Anfänger-Themen 13
G Observer löst zweimal aus Java Basics - Anfänger-Themen 8
A ein observer "post"problem Java Basics - Anfänger-Themen 3
F Observer Java Basics - Anfänger-Themen 7
U observer thread safe Java Basics - Anfänger-Themen 4
B Wozu Observer? Java Basics - Anfänger-Themen 9
Spin Observer Patteern java Java Basics - Anfänger-Themen 7
O Liste - Observer/Observeable - HashMap Hilfe Java Basics - Anfänger-Themen 19
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
P Fragen zum Observer Muster und Datenbanken Java Basics - Anfänger-Themen 2
T Observer ansprechen Java Basics - Anfänger-Themen 2
R Observer funktioniert nicht. Sehe keine Fehler Java Basics - Anfänger-Themen 2
hdi JList mit Model und Observer -> Chaos, blicke nicht durch Java Basics - Anfänger-Themen 22
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
N observer frage Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
N observer Java Basics - Anfänger-Themen 12
H [erledigt] Observable/Observer Beobachter entfernen Java Basics - Anfänger-Themen 2
G Unterschied Observer&Observable<->java.beans.Prope Java Basics - Anfänger-Themen 4
G Benötige Hilfe bei Problem mit Observer! Java Basics - Anfänger-Themen 2
E Observer Java Basics - Anfänger-Themen 7
K Observer Observable update() . Java Basics - Anfänger-Themen 13
Y Observer - notifyObservers(Object arg) Java Basics - Anfänger-Themen 4
M Servlets und Observer Java Basics - Anfänger-Themen 2
G Observable/Observer-Patterns Java Basics - Anfänger-Themen 9
G Observable/Observer update wird nicht ausgeführt Java Basics - Anfänger-Themen 9
D was ist der vorteil vom Builder-design pattern? Java Basics - Anfänger-Themen 11
W GoF-Pattern im Programmierer-Alltag Java Basics - Anfänger-Themen 113
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Pattern.matcher,die Besonderheiten. Java Basics - Anfänger-Themen 12
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
F Design pattern Java Basics - Anfänger-Themen 29
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
M Schlüsselworte Unterschied: String.matches und Pattern.compile Java Basics - Anfänger-Themen 2
C Best Practice JTable in MVC Pattern Java Basics - Anfänger-Themen 7
D Design Pattern Command Java Basics - Anfänger-Themen 3
Bregedur Methoden Matcher und Pattern bei sich wiederholenden Werten Java Basics - Anfänger-Themen 1
S Regex Pattern Java Basics - Anfänger-Themen 3
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
B Pattern für Email Liste Java Basics - Anfänger-Themen 3
J Builder Pattern implementieren Java Basics - Anfänger-Themen 3
Tarrew Proxy Design-Pattern Java Basics - Anfänger-Themen 1
M Methoden Pattern Matching Vokal Java Basics - Anfänger-Themen 2
agent47 Pattern split Java Basics - Anfänger-Themen 2
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
B Strategy Pattern - Rechner Java Basics - Anfänger-Themen 6
I Vertändnisfrage zu Prototype Pattern Java Basics - Anfänger-Themen 0
L Kompositum-Pattern Hilfe :O Java Basics - Anfänger-Themen 4
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
B Pattern Matching ohne Match-Methoden Java Basics - Anfänger-Themen 11
Furtano OOP Memento Pattern | übergabe einer Kopie des Arrays Java Basics - Anfänger-Themen 0
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
M MVC + Strategy Pattern Ansatz (mit Code) Java Basics - Anfänger-Themen 5
A Design Pattern - Welche? Java Basics - Anfänger-Themen 33
Rudolf OOP Übungen zu Design Pattern in Java Java Basics - Anfänger-Themen 6
S OOP Regex Pattern Java Basics - Anfänger-Themen 2
P Grundsatzfrage zu Decorator-Pattern Java Basics - Anfänger-Themen 6
L Pattern Matching Java Basics - Anfänger-Themen 3
L RegExp bzw Pattern in Java Java Basics - Anfänger-Themen 6
R aktualisierung des View im MVC-Pattern Java Basics - Anfänger-Themen 5
M RegEx Pattern Matcher Java Basics - Anfänger-Themen 16
R Pattern bzw. Regex HTML-Code Java Basics - Anfänger-Themen 10
N Regexp Pattern & Matcher Problem Java Basics - Anfänger-Themen 4
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
R Welches Design pattern Java Basics - Anfänger-Themen 10
B static und Pattern matching Java Basics - Anfänger-Themen 22
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
T Decorator Pattern Java Basics - Anfänger-Themen 7
A Pattern und Matcher Java Basics - Anfänger-Themen 9
T Frage zu Pattern/Matcher Java Basics - Anfänger-Themen 6
D Pattern in Midi-Sequencer Java Basics - Anfänger-Themen 2
V Frage zu Decorator-Pattern Java Basics - Anfänger-Themen 4
S OOP Factory Pattern Java Basics - Anfänger-Themen 2
M Regex-Pattern Java Basics - Anfänger-Themen 2
Haubitze_Broese Pattern für Links in RSS-Reader Java Basics - Anfänger-Themen 6
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11
O useDelimiter / Muster im Parameter (Pattern) Java Basics - Anfänger-Themen 6
S Problem mit Pattern Java Basics - Anfänger-Themen 2
S Pattern.matches mit Ignore Case Java Basics - Anfänger-Themen 2
N in int array einen pattern(eine zahl) finden Java Basics - Anfänger-Themen 21
A Hilfe zu Pattern Java Basics - Anfänger-Themen 2
Y Pattern Java Basics - Anfänger-Themen 2
A Proxy Pattern implementieren Java Basics - Anfänger-Themen 2
N OOP MVC Pattern Java Basics - Anfänger-Themen 3
G Probleme mit Pattern und Aussagenlogik Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben