Observer Pattern JLabel ändern

_BroNKo_

Mitglied
Guten Mittag,
habe folgende Frage Danke schonmal im voraus für Hilfe. Ich versuche gerade eine Gui für eine Api Schnittstelle zu programmieren.
Ich habe zwei Klassen eine Gui Klasse und eine Klasse die als Observer fungiert. In der Observer KLasse wird eine Methode ausgeführt wenn eine neue "Nachricht" von der Api kommt und über die Methode auf der Console ein Wert ausgegeben. Auf der Gui Klasse ist ein JLabel das eben wenn das passiert mit dem Wert initialisiert werden soll den diese Methode auf der Console ausgibt. Wie sollte ich hier Grundsätzlich bestmöglich vorgehen???
Hoffe meine Frage ist soweit verständlich formuliert...
 

Robat

Top Contributor
Deine GUI soll in dem Moment als Observer dienen und könnte daher das Interface java.util.Observer implementieren. Dadurch muss die update(Observable, Object) Methode überschrieben werden, in der du einfach den Text des JLabels updaten kannst. Dabei ist Object der String, den du in dein JLabel schreiben willst.

Deine "Oberserver-Klasse" [Name mEn schlecht gewählt] sollte dann von java.util.Observable erben damit du, in der von dir angesprochen Methode, die Methoden setChanged() und notifyObservers(<dein Wert als String>) aufrufen kannst. Natürlich muss in deiner "Observer-Klasse" noch der eigentliche Observer (was deine GUI ist) registriert werden.
 

_BroNKo_

Mitglied
Perfekt vielen vielen Dank´... läuft jetzt wie es soll :D
(P.S. du meintest von der GUI KLasse erben hast dich vertan bin aber Dank deiner Erklärung am Ziel)
 

Robat

Top Contributor
Ich habe zwei Klassen eine Gui Klasse und eine Klasse die als Observer fungiert
Nicht das du dir das falsch einprägst. Die Objekte, die über Änderungen informiert werden, sind die Observer. Das Objekt, welches ihre Observer über Änderungen informiert, ist Observable.

du meintest von der GUI KLasse erben
Meinte ich eigentlich nicht, nein.

Vielleicht einfach noch mal ein kleines Beispiel:
Java:
public class Window implements Observer {

    private JLabel labelToDisplayValue;
    private JFrame frame;

    public Window() {
        buildAndShowUI();
    }

    @Override
    public void update(Observable o, Object arg) {
        labelToDisplayValue.setText("Wert: " + arg);
    }

    private void buildAndShowUI() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,500);

        labelToDisplayValue = new JLabel("Wert: n/a");
        frame.add(labelToDisplayValue);

        frame.setVisible(true);
    }
}
Java:
public class FooObservable extends Observable {

    public FooObservable(Observer observer) {
        addObserver(observer);
        addSomeTask();
    }

    private void addSomeTask() {
        Runnable task = () -> {
            Scanner scanner = new Scanner(System.in);
            while(true) {
                String input = scanner.nextLine();
                setChanged();
                notifyObservers(input);
            }
        };
        Thread taskThread = new Thread(task);
        taskThread.start();
    }
}

Java:
public static void main(String[] args) {
    Window window = new Window();
    FooObservable observable = new FooObservable(window);
}
 

_BroNKo_

Mitglied
@Robat Bin etwas verwirrt jetzt hier mal Code Ausschnitte wie ich es jetzt programmiert habe. Bin offen für Verbesserungsvorschläge, ich würde es gerne so effizient wie möglich programmieren. Habe alles weggekürzt was nicht relevant ist, ist also nur Exemplarisch...Wenn die Api eine neue "Nachricht" hat dann wird die tickByTickMidPoint Methode ausgeführt die dann die Parameter übergeben bekommt die ich auch dem JLabel ausgeben will.

Java:
public class CPanel extends JPanel{

   private final JLabel lblKatze = new JLabel("Katze  ");

   JButton btnStartCurrency = new JButton("Start");
       btnStartCurrency.addMouseListener(new MouseAdapter() {
           @Override
           public void mouseClicked(MouseEvent e) {
               startReqData();
           }

   void startReqData() {
      
       final Contract katzeb = new Contract(0,"Hallo","CASH",null,0,null,null,"IDEAL","knallo",null,null);
      
       final ResultsPanel tickres_katze = new ResultsPanel(katzeb);
      
       String d_symbol = "Katze  ";
       tickres_katze.attach(lblKatze, d_symbol);
      
       Api.INSTANCE.controller().reqTickByTickData(katzeb, "MidPoint", 0, false, tickres_katze);
   }

   public void update(JLabel x,double m, String symbol) {
       x.setText(symbol + m);
   }
}
Java:
public class ResultsPanel extends CPanel{
  
   private Contract con;
   private ArrayList<JLabel> jl_helpobject;
   private String jl_symbol;
  
   public ResultsPanel(Contract u_con) {
       this.con = u_con;      
       this.jl_helpobject = new ArrayList<>();
   }
  
   @Override
   public void tickByTickMidPoint(int reqId, long time, double midPoint) {
       try
       {      
           update(jl_helpobject.get(0), midPoint, jl_symbol);
       }
           catch(Exception e) {System.out.println("ResultsPanell class Exception catched!");}
   }
   public void attach(JLabel l, String jlsymbol) {
       jl_symbol = jlsymbol;
       jl_helpobject.add(l);
   }
}
 

Robat

Top Contributor
Ich glaub du solltest dir das Observer-Pattern noch mal genauer anschauen.

Wenn die Methode tickByTickMidPoint(int, long, double) immer dann ausgeführt wird, wenn die API eine neue Nachricht hat, dann ist die Klasse ResultsPanel dein Subject (erweitert aus Java-Sicht also java.util.Observable). Wichtig ist, dass diese Klasse kein CPanel ist, sondern vielmehr ein oder mehrere CPanel(Observer) besitzt. Das Subject hat ein oder mehrere Observer, welche es über Datenänderungen informiert. Das geschieht über die Methode notifyObservers(Object data). Zuvor muss aber die Methode setChanged() aufgerufen werden, damit dieses Observable-Objekt als "verändert" markiert wird. Dein ResultsPanel muss also einen Konstruktor verpasst bekommen, welcher ein oder mehrere Observer entgegen nimmt, und muss diese mit der Methode addObserver(Observer o) registrieren.

Beispielhaft mal die tickByTickMidPoint(int, long, double) Methode dargestellt.
Java:
public void tickByTickMidPoint(int reqId, long time, double midPoint) {
    setChanged();
    notifyObservers(midPoint);
}
Dein CPanel ist kein Subject (Observable) sondern ein Observer. Dazu kann diese Klasse das Interface java.util.Observer implementieren und damit die update(Observable o, Object data) überschreiben. Diese Methode wird immer dann von Subject aufgerufen, wenn Änderungen präsent sind. In dieser Methode musst du dann den Text des Label neu setzen.

Solltest du in der update-Methode mehrere Daten übertragen wollen, müssen die Daten in eine Klasse gewrappt werden.
 

_BroNKo_

Mitglied
Ok hab es geschafft zu Implementieren. Mein Problem war die ganze Zeit das es zwar in der Theorie so ist das man meist mehrere Observer hat ich aber für in meinem Fall nur einen Observer habe für mehrere Subjekte, also jedes Subject hat sozusagen als Observer den selben Abonnenten nähmilch ein und das selbe GUI Objekt. Natürlich spielt das eigentlich keine Rolle hat mich aber verwirrt. Wie auch immer jetzt ist es denke ich sauber programmiert.
@Robat Danke für deine Hilfe der Link war auch Hilfreich Top :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
D Wie mehrere Grafiken auf JPanel anzeigen lassen? (Observer pattern?) AWT, Swing, JavaFX & SWT 24
hdi Observer-Pattern bei JPanel nicht möglich? AWT, Swing, JavaFX & SWT 7
U JAVAFX observer und threads AWT, Swing, JavaFX & SWT 1
R MVC Observer While-Schleife AWT, Swing, JavaFX & SWT 3
F JavaFX MVC und Observer AWT, Swing, JavaFX & SWT 4
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
O Swing AbstractTableModel - Observer.. AWT, Swing, JavaFX & SWT 14
K Swing und MVC + Observer AWT, Swing, JavaFX & SWT 4
G JTree - Observer oder Listener? AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
D Event in Fenster ausgeben + Observer + kein Plan AWT, Swing, JavaFX & SWT 2
Rudolf AWT Observer mit AWT AWT, Swing, JavaFX & SWT 5
P Observer und GUI Update AWT, Swing, JavaFX & SWT 2
S Observer Problem AWT, Swing, JavaFX & SWT 2
G eigenen Observer schreiben AWT, Swing, JavaFX & SWT 6
F Observer vs Listener AWT, Swing, JavaFX & SWT 2
F Eigener Observer? AWT, Swing, JavaFX & SWT 4
Z Observer/Observable und SWT AWT, Swing, JavaFX & SWT 2
B JavaFX Pattern (Aufteilung Zuständigkeiten AWT, Swing, JavaFX & SWT 7
M Swing MVC-Pattern - View mit mehreren Models AWT, Swing, JavaFX & SWT 5
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Cromewell JavaFX MVC-Pattern AWT, Swing, JavaFX & SWT 7
3 2D-Grafik BasicStroke dash pattern - Linie zu lang!? AWT, Swing, JavaFX & SWT 1
M Welches Pattern bei GUI Anwendungen? AWT, Swing, JavaFX & SWT 2
lumo SWT Image Pattern AWT, Swing, JavaFX & SWT 5
M Swing MVC Pattern verstanden, aber Probleme bei der Umsetzung AWT, Swing, JavaFX & SWT 5
C GUI Entwicklung - welches Pattern? AWT, Swing, JavaFX & SWT 16
J Swing Controller im MVC-Pattern AWT, Swing, JavaFX & SWT 9
G Hilfe! Command Pattern an easy ImageViewer? AWT, Swing, JavaFX & SWT 13
D MVC Pattern in Swing-Applikationen AWT, Swing, JavaFX & SWT 4
A MVC-Pattern - Kreuzweise Anwendung? AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C Swing Übergabe von String an JLabel AWT, Swing, JavaFX & SWT 9
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
D JLabel übereinanderlegen AWT, Swing, JavaFX & SWT 5
E JLabel kopieren AWT, Swing, JavaFX & SWT 31
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
E JLabel AWT, Swing, JavaFX & SWT 1
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
L JLabel ist verzerrt/größer als eingestellt AWT, Swing, JavaFX & SWT 15
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L Kalendar als JLabel einfügen AWT, Swing, JavaFX & SWT 3
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
P Aktualisierung von jLabel in jFrames AWT, Swing, JavaFX & SWT 8
DaCrazyJavaExpert Swing JLabel Klickanimation AWT, Swing, JavaFX & SWT 4
A Swing JLabel als Parameter übergeben AWT, Swing, JavaFX & SWT 9
M JLabel ausrichten AWT, Swing, JavaFX & SWT 2
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
T JLabel Textinhalt von Oben anzeigen AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
Thallius Swing "..." beim JLabel verhindern? AWT, Swing, JavaFX & SWT 3
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
T Event Handling JLabel als eigener Button AWT, Swing, JavaFX & SWT 7
T JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
F Abgeleitetes JLabel AWT, Swing, JavaFX & SWT 16
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
S jLabel HTML Formatierung AWT, Swing, JavaFX & SWT 2
J Statisches JLabel adden AWT, Swing, JavaFX & SWT 4
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
T JLabel in die Mitte(JLabel.CENTER geht nicht) AWT, Swing, JavaFX & SWT 12
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
K Swing unterschied JTextField und JLabel AWT, Swing, JavaFX & SWT 7
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
E JLabel aus Runnable ändern AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
F Swing JLabel wird nicht sofort Angezeigt AWT, Swing, JavaFX & SWT 3
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
GreyFox JLabel in laufender Anwendung erzeugen AWT, Swing, JavaFX & SWT 6
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
Z Auf ein JLabel drauf malen? AWT, Swing, JavaFX & SWT 1
S JLabel in den Vordergrund rücken AWT, Swing, JavaFX & SWT 1
A JLabel hochzählen lassen. AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben