2011-08-16 12 views
1

NetbeansフォームにBeanプロパティにバインドされたテキストフィールドを設定しました。バインディングは双方向であると想定されていますが、片方向でしか動作しません。 GUIのフィールドを更新するとBeanが更新されますが、Beanが更新されてもGUIは更新されません。Netbeans Bound FieldはGUIを更新していません

Netbeansのコードは、各プロパティのために、このようになります生成:

binding=org.jdesktop.beansbinding.Bindings.createAutoBinding(
    org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, crmmast1, 
    org.jdesktop.beansbinding.ELProperty.create("${fname}"), lname, 
    org.jdesktop.beansbinding.BeanProperty.create("text")); 

bindingGroup.addBinding(binding); 

マイ豆プロパティ変更のサポートが追加されました:

private PropertyChangeSupport changeSupport = new 
     PropertyChangeSupport(this);; 

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

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

    public void firePropertyChange (String propertyName, 
     Object old, Object newObj) { 
     changeSupport.firePropertyChange(propertyName, old, newObj); 
    } 

のプロパティの敷石の中で私が持っている:

public void setFname(String newName) { 
    firePropertyChange("fname", fname, newName); 
    this.fname = newName; 
} 

基本のBeanを更新すると、Beanは更新されますが、テキストフィールドは更新されませんプロパティの変更イベントが発生していることを確認しましたが、

答えて

4

同じ問題があります。本当に迷惑です。 AutoBindingについては、createAutoBinding呼び出しで指定したSourceとTargetの間に確立されたPropertyコンテキスト内のアクションをリッスンするように見えます。このため、JTextFieldのテキストを問題なくBeanプロパティに更新する必要があります。それは話すのと同じ綴りの「レール」にあります。

これは、私がJFileChooserを使っているように、別のソースから直接setX()を呼び出してJavaBeanを更新しようとすると、autobindingのメンバーはfirePropertyChangeメソッドが呼び出されます。バインディングは、最後のパラメータとして置かれますそれに接続されている「名前」を、持っていたことを確認してください、私が代わりにやったことだったので

myBean1.setFileLocation(fileChooser.getSelectedFile().getAbsolutePath()); 

を、代わりにその呼び出しを行う:

これが動作しないことcreateAutoBinding()を呼び出します。私はNetbeans Matisseのプロパティエディタの[詳細設定]タブの[ポップアップツールをバインド]でこれを行いました。以下の例では、ファイル名は "fileLocation"です。

binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, 
myBean1, 
org.jdesktop.beansbinding.ELProperty.create("${fileLocation}"), 
jTextField12, 
org.jdesktop.beansbinding.BeanProperty.create("text"), 
"fileLocation"); 
bindingGroup.addBinding(binding); 

JTextFieldのは私の選択したファイルを更新してしまうように結合「レール」に私を得た呼び出しは次のように見えた:

  Binding fileBind = bindingGroup.getBinding("fileLocation"); 
      Property fileProp = fileBind.getSourceProperty(); 
      fileProp.setValue(myBean1, fileChooser.getSelectedFile().getAbsolutePath()); 

私はgetBindingでこれをプルアップする必要がありました() Matisseは元のバインディングへの直接アクセスをロックするので、グローバルバインディンググループからgetSourceProperty()を呼び出す必要があります。コードは自動生成されているので、編集する必要はありません。コードを手作業で編集している場合は、プロパティオブジェクトに直接アクセスするために使用できる名前があることを常に確認できます。

いずれの場合でも、「外部のインフルエンサー」がBeanとJTextFieldで作業するための鍵は、バインディングプロパティ自体で変更を実行することです。

+0

正しいアプローチについては、下記のサルの回答をご覧ください。プロパティの変更を開始する前に、まずBeanの値を設定する必要があります。 –

1

最近私はnetbeansを使ってSwing GUIの作成を試みましたが、私は正確に同じ問題について疑問を抱いていました。

解決策が必要です。心に留めておくべき2つだけあります。

  1. あなたは豆の変更を伝播一度正しいprorperty名を提供する必要があります(あなたのケースでfnameには、[OK]をする必要があり)
  2. は、実際のBeanのプロパティを変更する必要がありますchangeSupport.firePropertyChangeが呼び出される前に参照:http://wiki.netbeans.org/BestPracticesWithJPAAndBeansBinding

これらの2つのことに従うと、すべてが動作するはずです。私はまた、JFileChooserを使ってテキストフィールドを変更し、手作業でバインディングのプロパティを設定する必要はありません(他の答えで示唆されているように)。

関連する問題