2012-03-28 2 views
11

同じオブジェクトを表示する複数のウィンドウ/ビューを持つアプリケーションがあります。たとえば、私は自分の写真のための名前と位置文字列とImageIconを持つユーザーオブジェクトを持っています。Javaによるデータバインド

はその後、私の窓の上に私はこのような、そのユーザオブジェクトの詳細を使用します -

  1. 私はJPanelのを作成します。
  2. 私は、ユーザオブジェクトデータへのテキスト/イメージを設定するためにこれらのラベルのそれぞれについてのsetText()(またはimageLabel用setIcon)を呼び出す(nameLabel、locationLabel、imageLabel)
  3. それにのJLabelを追加します。

私は繰り返し

  1. 用のユーザオブジェクトのデータは、ユーザーオブジェクトが変更されるたびに、私は再びラベルにのsetText()を呼び出す必要があり
  2. 示されている各ウィンドウをこれをしなければなりません。

私はデータバインディングを使用していたので、オブジェクトを更新したときに、オブジェクトにデータバインドされたGUI要素に自動的に反映されました。 Javaに類似したものはありますか?あなたが必要なもの

+0

してくださいとあなたの質問(複数可)/ ???に関するものですさのbetterbeansbinding.jarファイル、[SSCCE](http://sscce.org/)を投稿してくださいバインディング/データバインディングに関する問題を示す – mKorbel

+3

私は上記のリストで何をしているのかを正確に説明しました。すべての質問がSSCCEを必要とするわけではありません。特に、このような問題は、コードの問題については問いません。私はデータバインディングがJavaで可能であるかどうか尋ねています。なぜならC#ではGUI作業を行う標準的な方法なのでです。私はすべての公式の太陽がGoogleのデータバインディングの情報をGoogleと最初のページのGoogleの結果を私は 'Javaのdatabinding'のようなものが含まれている見つかりませんでした 'Javaのdatabinding apiの準備ができていない'と '豆のバインド:Javaのデータバインディングソリューション深刻な問題が発生しました。 –

+1

あなたの答えは蛇紋岩かJSR296 – mKorbel

答えて

3

MVPパターンは、あなたがこれを達成するのに役立ちます。これらのイベント(オブザーバーパターン)に応答するには、カスタムイベントを作成し、UIリスナーをアタッチする必要があります。 JavaはObserverとObservableコントラクトに加えてPropertyChangeEventsとPropertyChangeListenersを提供します。

3

データバインディングの記事のJava SE Application Designに例があります。

PropertyChangeSupportを使用するAbstractModelを参照してください。

オブジェクトが変更されたことを通知する必要があるクラスは、PropertyChangeListenerAbstractControllerを参照)を実装します。

1

私は長い間JavaとC#でコーディングしていました。 私は自分のpropertyChangeListenersをJavaでコーディングしました。

このオブジェクトのシリアル化では、シリアライザ、 XStream、Javaネイティブ・オブジェクトの直列化

DIYを使用する必要がある場合は、自分の方法を使用するか、@Pau Kiat WeeがOracleのインフラストラクチャを経由して進むこともできます。

はここより、すでにものにhttp://www.jgoodies.com/download/presentations/binding.pdf http://www.jgoodies.com/downloads/demos/

を建て

バインディングSwingのデータのためのルックなJGoodiesをお持ちの

あなたのビジネス・オブジェクトは、この抽象クラスから拡張されます、私の実装です。

すでに何か他のものから拡張していると、これはあなたのためにこのオプション信じられない作品あなたの 1でない場合は、確かに。

ほとんどおそらくあなたはpropertyChangeListeners登録をシリアル化し、それ(あなたのUIに依存するクラスを知らないと、これは頭痛の種になりますリモートサービス)。だから、我々はスキップされているシリアル化してどこかにいくつかのデータを送信するつもりはありませんこのようにして。

private void writeObject(java.io.ObjectOutputStream out)private void readObject(java.io.ObjectInputStream in) 署名を注意してください。私は意図的にそれらを空のままにして、これらの重要な メソッドシグネチャはJava Object Serializationとみなされます。

これはPropertyChangeEventの模倣されたインターフェイスです。私たちはobserverパターンを使用して登録者に通知します。

public interface IPropertyChangedListener extends EventListener { 

    public void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue); 

} 

これはDataBusinessObject

public abstract class DataObjectBase implements Serializable { 


    private List<IPropertyChangedListener> propertyChangeListeners=new ArrayList<IPropertyChangedListener>(); 
    public void addOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener) 
    { 
     ensureRegisterListCreated(); 
     propertyChangeListeners.add(propertyChangeListener); 
    } 

    public void removeOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener) 
    { 
     ensureRegisterListCreated(); 
     propertyChangeListeners.remove(propertyChangeListener); 
    } 

    public DataObjectBase() 
    { 
     ensureRegisterListCreated(); 
    } 

    public void ensureRegisterListCreated() 
    { 
     if(propertyChangeListeners==null) 
      propertyChangeListeners=new ArrayList<IPropertyChangedListener>();  
    } 

    protected void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue) 
    { 
     if(propertyChangeListeners.size()<=0) 
      return; 
     for (IPropertyChangedListener listener : propertyChangeListeners) { 
      listener.onPropertyChanged(source, propertyName, oldValue, newValue); 
     } 
    } 

    private void writeObject(java.io.ObjectOutputStream out) 
      throws IOException 
      { 

      } 

    private void readObject(java.io.ObjectInputStream in) 
       throws IOException { 


       } 

} 

の私達のベースさて、ここで

dataObject.addOnPropertyChangedListener(new IPropertyChangedListener() { 

       @Override 
       public void onPropertyChanged(Object source, String propertyName, 
         Object oldValue, Object newValue) { 
        System.out.println(String.format("%s %s %s",propertyName,oldValue,newValue)); 
//TODO:Fire your UI change now !!! 

       } 
      }); 

それを使用することができますが、あなたがいる場合、あなたのDataObjectに

public class dataObject extends BaseDataObject 
{ 

    private String editable; 

    public String getEditable() { 
     return editable; 
    } 

    public void setEditable(String isEditable) { 
     String oldValue=this.editable;  
     this.editable = isEditable; 
     onPropertyChanged(this,"Editable",oldValue,isEditable); 
    } 

} 

を行うために必要なものですあなたは私のやり方をしたくない、 t何らかの理由で。あなたはJGoodiesに従うべきです、これはすべての中で最高のものです。 デモでJNLPファイルをダウンロードすると、DataBindingの部分が表示されます。右上にある矢印をクリックするとコードセクションが表示されます。がんばろう! http://www.jgoodies.com/downloads/demos/

0

利用代わりbeansbinding.jar

関連する問題