JGoodies Binding oder EventBus verwenden?

G

Gast2

Gast
Hallo an alle.

Ich arbeite derzeit an einem Programm zum Konfigurieren von Geräten (Details sind unwichtig in diesem Fall).

Nach längeren Recherchen habe ich mich für eine einfach MVC Implementierung entschieden, da die Applikation recht simpel gestrickt ist und eine Einarbeitung in Eclipse RCP ect. aus Zeitgründen nicht darstellbar ist. Es wäre im übrigen mit Kanonen auf Spatzen geschossen.

Die Sache ist nur folgende: Ich möchte doch nicht den Property Change Support oder Oberserver/Observable verwenden.

Die beiden Kandidaten wären die JGoodies Binding lib oder die EventBus lib.

Was würdet ihr zum propagieren der Änderungen eher empfehlen?

Un die Gretchenfrage: Bei JGoodies wird ja automatisch in beide Richtungen synchronisiert. Wie kann man da noch einen Controller dazwischen hängen?
 
G

Gast2

Gast
Soviel ich weiß benutzt JGoodies Databinding den PropertyChangeSupport.
Databinding...

Aber ansonsten versteh ich deine Frage nicht. Du kannst doch Databinding nicht mit einem EventBus gleichstellen.
In einem Databinding weist du deinen Models Property Widgets zu.
 
G

Gast2

Gast
Soviel ich weiß benutzt JGoodies Databinding den PropertyChangeSupport.
Databinding...

Aber ansonsten versteh ich deine Frage nicht. Du kannst doch Databinding nicht mit einem EventBus gleichstellen.
In einem Databinding weist du deinen Models Property Widgets zu.

Hmm jetzt wo du es sagst. Hab da mit dem Binding definitiv etwas falsch verstanden. Die Gretchenfrage erübrigt sich dadurch ja auch ... hm ....

Damit ist die Entscheidung gefallen (Habe mich auch schon etwas mit EventBus beschäftigt und bin eben noch auf die JGoodies Data Binding Geschichte gestoßen. Hab das wirklich missverstanden).

Zum EventBus aber noch eine Frage:

Nehmen wir an ich habe ein Model, welches seine Änderungen über den Eventbus propagiert.

Gibt es da eine Möglichkeit, dass Views (Oder andere POJOs) die sich als Subscriber eintragen direkt eine Art Initialwert bekommen?
 
G

Gast2

Gast
Was heißt da ist die Entscheidung gefallen???
Ich hoffe doch für beides? Weil ein Programm braucht ein Databinding, das nimmt dir eine Menge arbeit ab und sowie ich das bei JGoodies gesehen habe kannst du da auch Validations miteinbauen.
 
G

Gast2

Gast
Was heißt da ist die Entscheidung gefallen???
Ich hoffe doch für beides? Weil ein Programm braucht ein Databinding, das nimmt dir eine Menge arbeit ab und sowie ich das bei JGoodies gesehen habe kannst du da auch Validations miteinbauen.

Ich war auf der Suche nach einem Publish Mechanismus für Property Changes in meinen Models.
Würde dafür gerne den EventBus verwenden.

Zu den Data Bindings: Mir erschließt sich das Thema noch nicht so ganz muss ich gestehen. Ich habe mich nur entschieden für das konkrete Problem des "Wie veröffentliche ich die Änderungen meiner Models" per Eventbus anstatt PropertyChangeSupport zu publizieren.

Für Tipps wie man beides in Kombination verwendet bin ich dankbar. Ein Minimalbeispiel wäre dann allerdings nett (Model + View + Controller).

EDIT:

Die Sache: Habe bis jetzt Hardware nahes C bzw. C++ programmiert. Java ist relativ neu für mich und daher habe ich schon sehr viel gelesen und auch gelernt. (Die Insel, Head First Java und Patterns ...)

Da mein erstes Java Projekt was die Datenhaltung betrifft eher simpel ist (Der Aufwand liegt im Daten einlesen und darstellen) möchte ich nur Konzepte verwenden die ich auch 100% verstanden habe. Flexibilität ist in einigen Bereich sehr wichtig (Austauschbarkeit der Kommunikationstreiber) und das ist auch durch entsprechende Muster gewährleistet.

Verständnisprobleme habe ich aber bei den ganzen Binding und GUI Frameworks ( Wie Eclipse RCP, SWT+JFace).

Da meine Software recht einfach gestrickt ist verwende ich ein einfaches Lehrbuchmäßiges MVC Design.

Wollte nur eben keinen Oberservable bzw. Property Change Support verwenden.
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Im PDF steht doch wie das Databinding arbeitet und für was es da ist.

es synchronsiert modeldaten und widgets. Ich hab keine Ahnung ob JGoodies mit EventBus arbeiten kann oder ob du zusätzlich PropertyChangeEvents feuern musst, das musst du eben in einem Protoyp ausprobieren.

Hier ein kleiner Artikel über Eclipse Databinding, um vielleicht die Idee zu verstehen.

Mach doch z.B. mal das hier durch programmier es nach. Und schau dann wie dein EventBus reinpasst.
JGoodies Databinding
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Im PDF steht doch wie das Databinding arbeitet und für was es da ist.

es synchronsiert modeldaten und widgets. Ich hab keine Ahnung ob JGoodies mit EventBus arbeiten kann oder ob du zusätzlich PropertyChangeEvents feuern musst, das musst du eben in einem Protoyp ausprobieren.

Hier ein kleiner Artikel über Eclipse Databinding, um vielleicht die Idee zu verstehen.

Die PDF hat mehr Fragen aufgeworfen als geklärt, da die Erläuterungen zur Präsentation fehlen.
Wo sitzt z.B. der Controller des Models in so einer Architektur. Das ist für mich halt alles sehr neu.

Der 2. Link scheint sehr Interessant ich les mir das erst mal durch!
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
So gelesen.

Verstehe ich das richtig:

- Model wird mit View über Data Binding verknüpft.
- Einen selbst programmierten Controller gibt es demnach nicht mehr.
- Mit einer entsprechenden Bindings Bibliothek kann man Validierungen als auch gepufferte bzw. Atomare Änderungen durchführen (Beispiel 2 Werte können nur gemeinsam geändert werden)

Wofür verwendet man dann konkret den EventBus?

Bitte entschuldigt wenn die Fragen trivial erscheinen, ich habe nen riesigen Knoten im Kopf wegen den ganzen Mustern und Frameworks die ich mir angeschaut habe.

PS: Das Eclipse Binding kommt nicht in Frage da ich mit Swing arbeite. Gibt es (außer der mir bekannten PDF) eventuell ein deutsches Tutorial zu JGoodies Binding?
 
G

Gast2

Gast
- Model wird mit View über Data Binding verknüpft.
- Einen selbst programmierten Controller gibt es demnach nicht mehr.
- Mit einer entsprechenden Bindings Bibliothek kann man Validierungen als auch gepufferte bzw. Atomare Änderungen durchführen (Beispiel 2 Werte können nur gemeinsam geändert werden)

Ja du verknüpfst die View an dein Model steht doch in den ganzen PDF's mehrmals =)...
Für was willst du den einen eigenen Controller??
Du kannst die Daten die z.B. in einem Textfeld eingegeben werden auf richtigkeit überprüfen d.h. validieren und wenn die nicht passen dem User ein Fehler anzeigen.

Keine Ahnung was du mit Atomare Änderungen meinst, aber sowas kannst du ja im Model machen?!?

Wofür verwendet man dann konkret den EventBus?

Bitte entschuldigt wenn die Fragen trivial erscheinen, ich habe nen riesigen Knoten im Kopf wegen den ganzen Mustern und Frameworks die ich mir angeschaut habe.

Darum solltest du halt mal anfangen es zu versuchen und nicht nur die Theorie wälzen, wenn du auf die Probleme stosst weißt du wofür Sie da sind...

kurz DataBinding ist nur für ein GUI-Element <-> Model Datenaustausch.
Der EventBus benachrichtigt mehrere Views. Beispiel Eclipse IDE du wählst in einer View was aus und einer andere View zeigt die Details an. Irgendwie muss die PropertyViews ja mitbekommen, dafür gibt es verschiedene Konzepte eines ist der EventBus...
PS: Das Eclipse Binding kommt nicht in Frage da ich mit Swing arbeite.

Du sollst auch erstmal den Sinn verstehen.


eventuell ein deutsches Tutorial zu JGoodies Binding?

Eher nicht, englisch muss reichen...

Hast du das 2te Tutorial angeschaut und durchgerarbeitet??? Da ist doch ein Bsp. dabei
 
G

Gast2

Gast
Das 2. Tutorial ist mir relativ unverständlich, da die ganzen Anmerkungen die der Redner wohl noch dazupackt fehlen. Werds aber versuchen.

Ich werde mal versuchen ein einfaches Beispiel zu posten was meine Verständnis Probleme erklärt:

Nehmen wir an ich habe ein Model mit 2 Eigenschaften:
1) Text
2) Sichtbar

Nun ferner 2 Views:
1) Darstellung des Models
2) Ein Menü zum toggeln der Sichtbarkeit

Nun binde ich View1 mit dem Text und View 2 mit dem Sichtbar Attribut.

Wo würde man nun ein EventBus einsetzen? Beide Views werden ja schon per Binding aktualisiert.

Ich programmier das mal als Beispiel und poste es alsbald. Ist eine sehr vereinfachte Version meines "real Life" Problems.
 
G

Gast2

Gast
So hier ein konkretes Beispiel mit einem konkreten Problem. Aber erst mal das Beispiel:

Model Klasse:

Java:
import com.jgoodies.binding.beans.Model;

public class MyModel extends Model {
    public static final String TEXT_PROPERTY = "text";
    public static final String VISIBLE_PROPERTY = "visible";
    
    /* Model content is a simple text */
    private String text ;
    
    /* visible determines if view is visible or not */
    private boolean visible;
    
    public MyModel() {
      text = "Initial text...";
      visible = false;
    }
    
    public String getText() {
        return text;
    }
    
    public boolean isVisible() {
        return visible;
    }
    
    public void setText(String text) {
        String oldValue = this.text;
        this.text = text;
        firePropertyChange(TEXT_PROPERTY, oldValue, text, false);
    }
    
    public void setVisible(boolean visible) {
        boolean oldValue = this.visible;
        this.visible = visible;
        firePropertyChange(VISIBLE_PROPERTY, oldValue, visible, false);
    }
}

View Klasse:

Java:
import java.awt.BorderLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.jgoodies.binding.adapter.BasicComponentFactory;
import com.jgoodies.binding.beans.PropertyAdapter;
import com.jgoodies.binding.value.ValueModel;

public class View extends JPanel {

    private JTextField textField1;
    private JLabel textLabel;
    private JTextField textField2;
        
    public View(MyModel myModel) {
        ValueModel textValueModel = new PropertyAdapter<MyModel>(myModel, MyModel.TEXT_PROPERTY, true);
        
        textLabel = BasicComponentFactory.createLabel(textValueModel);
        textField1 = BasicComponentFactory.createTextField(textValueModel);        
        textField2 = BasicComponentFactory.createTextField(textValueModel);
        
        setLayout(new BorderLayout());
        add(BorderLayout.NORTH, textField1);
        add(BorderLayout.CENTER, textLabel);
        add(BorderLayout.SOUTH, textField2);
    }
}

Und die Klasse welche alles startet:

Java:
import javax.swing.JFrame;


public class Main {
    public static void main(String[] args) {
        MyModel model = new MyModel();
        View view = new View(model);
        
        JFrame frame = new JFrame(); 
        frame.add(view);
        frame.pack();
        frame.setVisible(true);
    }
}

Meine Fragen nun:

1) Wie binde ich die Visible Eigenschaft des Models an das Visible Attribut des View? Bzw. Ist das konzeptionell falsch? Wie würde man es sonst machen?

2) Die Property wird erst geändert (Und die anderen Widgets erst geupdatet) wenn ich ein anderes Widget anklicke. Würde gerne mit einem Enter das Update auslösen. Habe dazu das PresentationModel als gepuffertes Binding gefunden. Da kann man dann eigene Events und Actions hinterlegen. Wäre das der richtige Ansatz?

PS: Das Visible könnte z.B. von einem Checkbox, Menü Eintrag oder sonst was geändert werden (Dann auch per Binding). Habe ich jetzt mal ausgespart.

PPS: Sorry das ich jetzt so langsam vorgehe aber der Knoten soll sich lösen. Daher ein einfaches Verständnisproblem nach dem anderen ^^

@SirWayne: Schon mal vielen Dank! Deine Hinweise schubbsen mich so langsam in die richtige Richtung glaube ich. Wär super wenn du mir weiterhin so hilfsbereit zur Seite stehen würdest.
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Eine Nacht schlafen bewirkt manchmal Wunder. So langsam glaube ich zu verstehen wie man Bindings einsetzt und wofür man den EventBus benötigt.

Die Problematik des setVisible eines z.B. JFrame ist jetzt auch klar, da man z.B. einen PropertyConnector direkt verwenden kann um 2 Bean Properties zu synchronisieren. In meinem Fall dann das ModelProperty visible mit dem JPanel Property visible.

EventBus würde ich nach meinem Verständnis jetzt z.B. einsetzen, wenn irgendwo ein Ereignis eintritt auf welches ich mit einer Aktion an verschiedenen Stellen reagieren muss, welches komplexer als eine Property Änderung ist.

Beispiel: Vorgang XY starten auf Button Druck. Dazu würde ich ein VorgangXY starten Event über den EventBus schicken auf welches dann an entsprechenden Stellen reagiert werden kann, ohne, dass ich ein eigenes Listener Framework brauche.

Ist das soweit in die richtige Richtung gedacht?

Anbei nochmal mein aktualisiertes Beispiel.
 

Anhänge

  • Example.zip
    1,7 KB · Aufrufe: 2

Ähnliche Java Themen

Neue Themen


Oben