Problem z beans binding

0

Witam
Mam problem z podbindowaniem pola imie z obiektu klasy Osoba. Tekst w obu textfieldach powinien na bieżąco się synchronizować, ale niestety tak nie jest. Co robię źle? Dzięki za pomoc.

package beansbindingtest;

import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import java.beans.PropertyChangeSupport;

class Osoba {

private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
private String imie = "Adam";

public String getImie() {
return imie;
}

public void setImie(String imie) {
String old = this.imie;
this.imie = imie;
changeSupport.firePropertyChange("imie", old, imie);
System.out.println("setImie");

}
}
/**
* The application's main frame.
*/
public class BeansBindingTestView extends FrameView {

private Osoba nazwa;

public Osoba getNazwa() {
return nazwa;
}

public void setNazwa(Osoba nazwa) {
Osoba old = this.nazwa;
this.nazwa = nazwa;
firePropertyChange("nazwa", old, nazwa);
System.out.println("setNazwa");
}

public BeansBindingTestView(SingleFrameApplication app) {
super(app);
initComponents();
setNazwa(new Osoba());
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
//
private void initComponents() {
bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

mainPanel = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();

mainPanel.setName("mainPanel"); // NOI18N
mainPanel.setLayout(new java.awt.BorderLayout());

jTextField1.setName("jTextField1"); // NOI18N

org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, org.jdesktop.beansbinding.ELProperty.create("${nazwa.imie}"), jTextField1, org.jdesktop.beansbinding.BeanProperty.create("text"));
bindingGroup.addBinding(binding);

mainPanel.add(jTextField1, java.awt.BorderLayout.NORTH);

jTextField2.setName("jTextField2"); // NOI18N

binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, org.jdesktop.beansbinding.ELProperty.create("${nazwa.imie}"), jTextField2, org.jdesktop.beansbinding.BeanProperty.create("text"));
bindingGroup.addBinding(binding);

mainPanel.add(jTextField2, java.awt.BorderLayout.SOUTH);

jLabel1.setName("jLabel1"); // NOI18N

binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, org.jdesktop.beansbinding.ELProperty.create("${nazwa.imie}"), jLabel1, org.jdesktop.beansbinding.BeanProperty.create("text"));
bindingGroup.addBinding(binding);

mainPanel.add(jLabel1, java.awt.BorderLayout.CENTER);

setComponent(mainPanel);

bindingGroup.bind();
}//

// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JPanel mainPanel;
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration
}
0

Zastanawia mnie jak działa binder. Jeżeli sam odpala własny wątek to rzeczywiście jest problem braku synchronizacji. Jeżeli jednak nie jest on odpalany to moim zdaniem wykonujesz tylko pojedyncze bindowanie w initComponents(). Co to jest za framework dokładnie?

0

Korzystam z Swing Application Framework (JSR-296). Aplikację wyklikałem w Netbeans. Tu jest przykład prostej aplikacji bazodanowej:

http://www.netbeans.org/kb/60/java/gui-db.html

Jeśli binduje element tabelki tak jak przykładzie to wszystko działa. Bindowanie działa też jeśli binduje JTextField do pola typu String, oczywiście poprzez metody get/set i PropertyChangeSupport.

0

hm....

"${nazwa.imie}"

a nie

"${osoba.imie}"

Przecież nazwa nie ma pola imie?

0

Co ma być beanem, this czy nazwa?

Moim zdaniem powinna być nazwa.

Dlatego:
Należy wywalić metody getNazwa() i setNazwa()

W
org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, org.jdesktop.beansbinding.ELProperty.create("${nazwa.imie}"), jTextField1, org.jdesktop.beansbinding.BeanProperty.create("text"));

trzeba poprawić 2 rzeczy:

  1. this na nazwa
  2. ${nazwa.imie} na ${imie}

Czy przed changeSupport.firePropertyChange("imie", old, imie);
nie powinno być warunku if (!old.equals(imie)) ... ?

Z beans binding poczekałbym do Javy 7.
Wtedy będzie w standardzie języka i nie trzeba będzie korzystać z dodatkowego pakietu.

0
__krzysiek85 napisał(a)

Co ma być beanem, this czy nazwa?

Moim zdaniem powinna być nazwa.

Dlatego:
Należy wywalić metody getNazwa() i setNazwa()

W
org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, org.jdesktop.beansbinding.ELProperty.create("${nazwa.imie}"), jTextField1, org.jdesktop.beansbinding.BeanProperty.create("text"));

trzeba poprawić 2 rzeczy:

  1. this na nazwa
  2. ${nazwa.imie} na ${imie}

Czy przed changeSupport.firePropertyChange("imie", old, imie);
nie powinno być warunku if (!old.equals(imie)) ... ?

Taki kod wygenerował mi NetBeans 6.0, wolałbym go nie modyfikować ręcznie, gdyż w przeciwnym wypadku będę mieć problem z późniejszymi modyfikacjami interfejsu programu.

__krzysiek85 napisał(a)

Co ma być beanem, this czy nazwa?
Z beans binding poczekałbym do Javy 7.
Wtedy będzie w standardzie języka i nie trzeba będzie korzystać z dodatkowego pakietu.

Jeden dodatkowy jar nie jest specjalnym problemem, a beans binding niesamowicie zmniejsza ilość "kleju" między logiką a GUI... o ile działa ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1