2012-04-12 9 views
0

私は高度なモジュラーGUIシステムを開発中です。私はそれができるだけ柔軟になるように、そしてできるだけ多くの人に有益に役立つように(しかし、それは合理的にニッチになる)必要があります。GUI - コールセッターまたはディスパッチイベント?

私が考えることを引き起こしている私のデザインの一部は、各コンポーネントが最良のアプリケーションの残りの部分と対話する方法です。コンポーネントが作用すべきでセッターのクラスと名前に

  1. パス:

    は、私は2つのアプローチを参照してください。これにより、必要に応じてセッター内からイベントをディスパッチすることができます。

  2. コンポーネントは関連データで、ディスパッチべきCustomEvent渡します。私はこれがイベントリスナーをたくさん招き、余分な複雑さを感じるかもしれません。

しかし、ベストプラクティスは何ですか?それぞれの長所と短所は何ですか?より良い方法はありますか?

  1. Basicの例:

    public class Button extends Sprite 
    { 
    private var _property:String; 
    private var _object:*; 
    
    public function Button(label:String, object:*, property:String) 
    { 
        _property = property; 
        _object = object; 
        addEventListener(MouseEvent.CLICK, onClick); 
    } 
    
    private function onClick(e:MouseEvent):void 
    { 
        _object[_property] = "Changed"; 
    } 
    
    } 
    
  2. 基本例:

    public class Button extends Sprite 
    { 
    private var _event:GuiEvent; 
    
    public function Button(label:String, event:GuiEvent) 
    { 
        _event = event; 
        addEventListener(MouseEvent.CLICK, onClick); 
    } 
    
    private function onClick(e:MouseEvent):void 
    { 
        dispatchEvent(new GuiEvent(_event.type, "Changed")); 
    } 
    
    } 
    
+1

エディタ(リスト、入力フィールド、そのような要素など)とボタンのイベントまたはメソッドクロージャにオプション1(バインディング)を使用します。私は、DataBindingのための少しの最小限のコンパイルを再構築しています。http://turbosqel.pl/mix/で確認できます。イベントは良いですが、もっとコードを必要とし、何かを変更するのが難しくなります。 – turbosqel

+0

ええ、いくつかのGUIフレームワークがそのようなシステムを使用しているのがわかります – davivid

答えて

0

あなたのGUIフレームワークは皆に役立つようにしたい場合は、代わりに標準のイベントを使用する必要があります新しいものを発明するのです。第二の選択肢は行く方法ですが、物事を単純に保つようにしてください。例2で書いたコードは信じられないほど複雑に思えます。それは単にそのように書くことができます:あなたの質問には本当に答え

button.addEventListener(MouseEvent.CLICK, onClick); 
+0

実際に多くのコンポーネントで構成されている可能性のあるアドバンスコントロールではうまくいかないのでしょうか?理にかなった標準的なイベントはありませんか?たとえば、x/yフェーダーといくつかのチェックボックスで構成されるコントロールを取ると、どのようなイベントを聞きますか?さらに、ディスパッチされるすべてのイベントを渡すと、コントローラがリスナーにGUIコンテナを認識させるのに意味がないでしょうか? – davivid

+0

クリックのような基本的なことは、ユーザーが新しいイベントを習得するのではなく、既に定義されているイベントを使用することが理にかなっています。コンポーネントがより複雑な場合は、カスタムイベントを作成する必要があります。 –

+0

イベントは、非同期操作と制御の方が優れています。ボタンのこの単純なケースではOKかもしれませんが、TextFields、スライダ、CheckBoxおよびその他のツールについて考えることができます。あなたは常にitem.addEventListener(...)という行を書くことができます。とcreat関数doSmth(e:Event)、私はitem.bind(target、key)を作成します。多くの時間とライティングを節約します。 – turbosqel

0

少しofftopicない:

public class Button extends Sprite 
{ 

    public function Button(label:String) 
    { 
    } 

} 

その後、誰もが、彼らは知っているイベントを使用してクリック数を扱うことができる

なぜ、すでに存在するものを作り直すのですか?既にGUIコンポーネントを備えた実績のあるライブラリがあります。

例えば、AS3寺ライブラリを取る http://code.google.com/p/templelibrary/


このフォーム要素部品のすべての種類があります。ラジオボタン、コンボボックス、入力フィールド、ファイルフィールド、スクロールコンポーネント、日付セレクタ、(ステップ)スライダ、リスト、スクロールバー、オートコンプリートフィールド、およびすべてのタイプのボタンがあります。 また、サービスのいずれかのタイプにデータを配信、検証するのに役立ちますwhichs Formクラスを、持っています。それはまた、すべてのコントロールがキーボードでも使用できるように、誰もがそれが動作することを期待しているように、右のtabindexesを管理します。モックアップのコーデックコンポーネントもありますが、同じコードを使用して、ライブラリアイテム、タイムライン、または必要な限り無限の創造性でスタイルを設定することができます。ほとんどのGUIコンポーネントは、ニーズに合わせて拡張できるように設計されています。

ほとんどのguiコンポーネントは、通常のイベントリスナー(ほとんどの場合、コンテンツが変更されたときにEvent.CHANGEを送出します)で動作します。ほとんどの場合、新しいタイプのイベントにラップする必要はありません。

+0

リンクに感謝します。しかし、あなたの質問に答えるには - 私はこれを学習の練習としてやっているのです。また、私のコンポーネントの多くがこれまでの多くの図書館で見たこととはかなり違うからです。 – davivid

関連する問題