Binding - nur welche nutzen ?

melmager

Erfahrenes Mitglied
ich forste mich ja schon seit Tagen durch das Thema Binding.

Sprich wenn sich im View (jText Classe) sich was ändert soll eine eigene Classe die auch nach dem Beansprinzip erstellt wurde das mitbekommen und die dann auch im umgekehrten Weg per "setText()" mein View ändern kann.

wenn ich also zwei JTextFelder habe besitzen beide ja die Property "text" ,

meine eigene Klasse hat dann 2 Propertys "name" und "ort" - - so weit reicht noch mein Verständniss.

jetz komme ich zum Punkt das ich jFeld1(text-property) an myclass(name-property) anpassen muss.

Ich bin über das stichword Binding gestolpert ..
nur bei googel lande ich da bei der Version von netBeans (was ich nicht nutzen kann da die nur 2 Grafische Elemente verbinden)
oder bei JavaFX oder bei jGoodies.

sehe ich das richtig das ich jGoodies installieren muss und mich damit beschäftigen muss um das Binding und adaptiere Propertys regeln zu können ?

ne Swing lösung habe ich jedenfalls noch nicht gefunden ...

edit: Apache scheint auch eine version zu haben ...
 
Zuletzt bearbeitet:

takidoso

Erfahrenes Mitglied
Hi melmager,
Wenn ich Dich richtig verstehe möchtest Du in Deinem Gui Textfelder inhaltlich updaten, wenn Du eine JavaBean änderst und anderherum, gelle?
Dafür würde ich ehrlich gesagt kein zusätzliches Framework mi ranlachen wollen, das geht auch mit ganz normalen Standardwegen innerhalb von Java.
Als Stichwort sei hier Listener erwähnt.

Für den Weg vom Textfeld zu Deiner JavaBean, sollte es einen entsprechenden Listener geben, den Deine JavaBean einfach nur implementieren muss.
Für den Weg zurück kannst Du ein sogenanntes PropertyChangeSupport-Objekt verwenden.

Deine Komponente, die nun die Textfelder in sich birgt (z.b. der JFrame, falls Du dafür einen verwendest) würde dann für die JavaBeans als PropertyChangeListener fungieren, also dieses Interface entsprechend Deinen Bedürfnissen implementieren.

Grobes Beispiel
Java:
public class Bean1
{
   String m_feld1 = null;
   String m_feld2 = null;

   PropertyChangeSupport m_propsChangeSupport = new PropertyChangeSupport (this)

   	public void addPropertyListener(PropertyChangeListener listener)
	{
		m_propsChangeSupport.addPropertyChangeListener(listener);
	}
	
	public void addPropertyListener(String propsName, PropertyChangeListener listener)
	{
		m_propsChangeSupport.addPropertyChangeListener(propsName, listener);
	}
	
	public void removePropertyChangeListener(PropertyChangeListener listener)
	{
		m_propsChangeSupport.removePropertyChangeListener(listener);
	}
	public void removePropertyChangeListener(String propsName,PropertyChangeListener listener)
	{
		m_propsChangeSupport.removePropertyChangeListener(propsName,listener);
	}
  

        public void setFeld1(String text)
        {
            String oldFeld1 = m_feld1;
            String m_feld1  = test;
            m_propsChangeSupport.firePropertyChange("feld1", oldFeld1, m_feld1);     
        }
        public String getFeld1()
        {
             return m_feld1;
        }

        
        public void setFeld2(String text)
        {
            String oldFeld2 = m_feld2;
            String m_feld2  = test;
            m_propsChangeSupport.firePropertyChange("feld2", oldFeld2, m_feld2);     
        }
        public String getFeld1()
        {
             return m_feld1;
        }

}
//---------------------------------------

public class MyPanel extends JPanel implements PropertyChangeListener
{
     JTextField textFiled1 = new JTextField()
     JTextField textField2 = new JTextField()

        public void propertyChange(PropertyChangeEvent evt)
        {
               // schau nach von wem der Event kam und setze textfeld1 oder textfeld2
        }

        public MyPanel ()
        {
              // hohle von woher auch immer Deine(n) Bean her
              // und registriere dieses Panel als PropertyChangeListener
              // bzw regstriere den oder die Beans als Listener zu Deien Textfeldern.
              // es wäre archetektonsich vielleicht auch sinnige dies in einer anderen
             // Klasse zu tun, wo dieses Panel instanziiert wird (Situationsabhängig)
        }
       
     ...

}
 

melmager

Erfahrenes Mitglied
ja auf Property Change bin ich auch gekommen

und ich ich habe mir eigene Adapterclassen gebastelt die auf dem Listener Prinzip arbeiten

Jtext > Adapter (change Listener) > datenclasse.setxxx
jtext.setText < Adapter(change Listener) < datenclasse

Eins von den Problemen war ja das ein Textfeld nur mit text was anfangen konnte und ich mehrere Propertiys in der datenclasse hatte also auch verschiedene Propertynamen :-(

Jtext ist da ja noch simpel - ich Habe da noch Spinner im Angebot - property cange auf spinner ist witzlos , scheinbar muss ich ein propertychange auf dem spinnermodell machen um ein wertwechsel mitzubekommen
 

takidoso

Erfahrenes Mitglied
Die veschiedeen Swing-Komponenten geben selbst Events vo sich, man muss sich nur dranhängen, spich, einen entsprechenden Listener implementieren und dort hinzufügen (registrieren).
Der Weg anderherum dafür brächtest Du lediglich Diese PropertyChangeSupport angelegenheiten.
Früher als ich von der Klasse PopertyChangeSupport noch nichts wußte, abe ich auch immer meine eigenen Interfaces und Events gebastelt. Mit PopertyChangeSupport und den zugehörigen Klassen kann man sich also eine Menge Codierungsaufwand sparen.

Für den JSpinner wäre ganz offensichtlich dann die Registrierung über
Java:
spinner.addChangeListener(listener)
zu lösen.
 
Zuletzt bearbeitet: