2009-03-11 3 views
3

私は可変レート(かなり高速のデータストリームから私のコントロールから受け取ったものの最大120Kバイト/秒)でデータを更新するJavaアプリを持っています。受信したバイト数/パケット数などの統計情報をダイアログボックスで表示します。jgoodies bindings +頻繁な変更を融合する

私はJGoodies bindingsを探していて、低速で受信した人工データを予備的に処理していました。私がやりたい何

は、大体、次のとおりです。

  1. は、Beanクラスを作成し、このような何か:

    public class Statistics 
    { 
        private int bytes; 
        private int goodPackets; 
        private int badPackets; 
        private int totalPackets; 
    
        public int getBytes() { return bytes; } 
        public int getGoodPackets() { return goodPackets; } 
        public int getBadPackets() { return badPackets; } 
        public int getTotalPackets() { return totalPackets; } 
    
        public void update(/* TBD */) { /* updates the fields appropriately */ } 
        public Statistics() { bytes=goodPackets=badPackets=totalPackets=0; } 
    } 
    
    Statistics stats; 
    
  2. は私のGUI

  3. の要素に4つのフィールドをバインド
  4. 私の主なアプリケーションスレッドでは、何らかの速度でstats.update()を呼び出すことができます。ここで、「更新」の呼び出しはGUIの変更リスナーをトリガーするものです
  5. GUIは、私が指定できるより低いレート(約5-20Hz)で「自動的に」更新されるので、トリガされたイベントのゴブで圧倒されることはありません。

私にしたいことをさせる適切なメカニズムがありますか?私はJGoodies DelayedReadValueModelを見ていますが、実際に使用する方法はわかりません。

私は手動でそれを自分自身をしなければならなかった場合、私はおそらくであろうことを推測です:

  1. は、統計のミラーコピーを持っているし、更新フラグのいくつかの種類だけでなく、からのリンクを追加しますミラーリングされたコピー元の、およびタイマーのタイムアウトupdate()メソッドが呼び出され
  2. は、更新フラグを設定し、maybePropagate()
  3. maybePropagate()のようなメソッドを呼び出します。タイマーのタイムアウトが進行中である場合、またはへのリンクミラーリングされたコピーはnullですが、何もしません。それ以外の場合はタイムアウトを開始し、更新されたデータをミラーリングされたコピーに送信し、更新フラグ
  4. をクリアします。タイマーのタイムアウトが満了すると、更新フラグが設定され、ミラーリングされたコピーへのリンクがnullでない場合、ミラーリングされたコピーにデータを更新し、更新フラグをクリアします
  5. 前の4つの要素を実装すると、ミラーリングされたコピーの最大レートが更新されるため、ミラーリングされたコピーのフィールドにGUI要素をバインドできます通常のJGoodies BeanAdapterです。

あなたはバイトのフィールドに値モデルをラップすることができ、更新を遅らせるために今

ValueModel bytesModel = statsPresentationModel.getModel("bytes"); 
label = BasicComponentFactory.createLabel(bytesModel); 

答えて

1

あなたの統計のためのプレゼンテーションモデルを持って考えると、あなたの結合コードは次のようになります

ValueModel bytesModel = new DelayedReadValueModel(statsPresentationModel.getModel("bytes")); 
label = BasicComponentFactory.createLabel(bytesModel); 
+0

+1 ...今私はそれを試してみる時間を見つけることができます:( –

2

JGoodies Bindingはこの問題をDelayed *クラスで解決しますが、標準のSwing機能を使用する方法を検討することもできます。

SwingWorkerを使用する場合、要素をバックグラウンドで公開し、EDTで処理できます。 SwingWorkerプロセスは公開されたデータのチャンクを取得し、EDT変更の数を減らします。