2016-06-01 17 views
0

Ich habe versucht, mit Bohnen-Bindung in Java zu arbeiten. Ich habe Code in einigen Seiten verfolgt. Und ich habe versucht, es zum Laufen zu bringen.Bohnen Bindung in JTextField funktioniert nicht

Hier habe ich versucht, den Vornamen der Person mit dem Wert zu aktualisieren, den Benutzer während der Laufzeit in das Textfeld eingegeben haben. Aber wenn ich auf den Knopf klicke, enthält es "omg". Wenn ich das durch "" ersetze, enthält es diesen Wert. Wie ich beziehe, sieht es aus wie nur einmal zu arbeiten. Was stimmt damit nicht? Was habe ich hier vermisst? Kann jemand helfen, das zu lösen?

I vertauscht Quelle und Ziel und versuchte, dass

import java.beans.PropertyChangeListener; 
    import java.beans.PropertyChangeSupport; 

    public abstract class AbstractModelObject { 
     private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); 

     public void addPropertyChangeListener(PropertyChangeListener listener) { 
      propertyChangeSupport.addPropertyChangeListener(listener); 
     } 

     public void addPropertyChangeListener(String propertyName, 
       PropertyChangeListener listener) { 
      propertyChangeSupport.addPropertyChangeListener(propertyName, listener); 
     } 

     public void removePropertyChangeListener(PropertyChangeListener listener) { 
      propertyChangeSupport.removePropertyChangeListener(listener); 
     } 

     public void removePropertyChangeListener(String propertyName, 
       PropertyChangeListener listener) { 
      propertyChangeSupport.removePropertyChangeListener(propertyName, 
        listener); 
     } 

     protected void firePropertyChange(String propertyName, Object oldValue, 
       Object newValue) { 
      propertyChangeSupport.firePropertyChange(propertyName, oldValue, 
        newValue); 
     } 
    } 

    import java.beans.PropertyChangeListener; 
     import java.beans.PropertyChangeSupport; 

     public class PersonImpl extends AbstractModelObject implements Person{ 
      private String firstName; 
      private String lastName; 

      public PersonImpl() 
      { 

      } 

      public PersonImpl(String firstName) 
      { 
       this.firstName = firstName; 
      } 

      public String getFirstName() 
      { 
       System.out.println("getFirstName"); 
       return firstName; 
      } 

      public void setFirstName(String firstName) 
      { 
       System.out.println("setFirstName"); 
       String old = this.firstName; 
       this.firstName = firstName; 
       firePropertyChange("firstName",old,firstName); 
      } 
     } 


     public interface Person { 

      void setFirstName(String string); 

      String getFirstName(); 

     } 

      public class MyFrame extends JFrame { 
       JTextField field = new JTextField("omg"); 
       JButton button = new JButton("Save"); 
       Person p = new PersonImpl(); 

       MyFrame() 
       { 

        button.addActionListener(new ActionListener(){ 
         @Override 
         public void actionPerformed(ActionEvent e) { 
          System.out.println("first name : " + p.getFirstName()); 
         } 
        }); 
       } 
       private void initDataBinding() { 
        if(Beans.isDesignTime()){return;} 
        BeanProperty<Person, String> fNameProperty = 
          BeanProperty.create("firstName"); 

        BeanProperty<JTextField, String> textProperty = 
          BeanProperty.create("text"); 
        BindingGroup bindingGroup = new BindingGroup(); 



AutoBinding<JTextField, String, Person, String> firstNameBinding 
        = Bindings.createAutoBinding(UpdateStrategy.READ, field, textProperty,p, fNameProperty); 
        firstNameBinding.bind(); 
       } 
      } 

Antwort

0

Normalerweise auch diese Art von Bindung mit READWRITE geschaffen würde. Das scheint nicht die Wurzel Ihres Problems zu sein, aber etwas, das geändert werden könnte.

Die erste Sache, die hier zu überprüfen ist, um einen Breakpoint auf den verbindlichen Create Call setzen und stellen Sie sicher, dass es tatsächlich aufgerufen wird.

Wenn dies der Fall ist, ziehen Sie in Betracht, einen verbindlichen Listener hinzuzufügen, bevor Sie .bind() aufrufen und prüfen, ob fehlerhafte Bindungsoperationen gemeldet werden. Das sollte Ihnen helfen, das Problem schnell zu finden.

+0

Es fügt Listener hinzu, wenn .bind() aufgerufen wird. Und es gibt keinen fehlgeschlagenen Bindungsvorgang .. :( – Janu

+0

Haben Sie der Bindung einen verbindlichen Listener hinzugefügt? Wenn ja, geben Sie an, welche Listener-Callbacks aufgerufen werden ... –

+0

Hoppla ... Was bedeutet, dass ich addPropertyChangeListener hinzufügen sollte? hinzugefügt, dass .. Ist es obligatorisch oder optional? – Janu

Verwandte Themen