2012-04-12 51 views
0

我正在開發先進的模塊化GUI系統。我需要它儘可能地靈活,並希望儘可能多的人有用(但它將是合理的利基)。圖形用戶界面 - 調用setters或調度事件?

我的設計是導致我想到的組成部分,是如何各組件應與最好的應用程序的互動。

我看到兩種方法:

  1. 傳遞一個二傳手,對其中的部分應當在採取行動的類別和名稱。如果需要,這仍然允許從setter中派發事件。
  2. 傳遞組件應該派發的CustomEvent以及相關數據。儘管我覺得這可能會導致很多事件監聽器,並且會帶來額外的複雜性。

但是什麼是最佳實踐?每個的優缺點是什麼?有更好的方法嗎?

  1. 基本例如:

    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 2012-04-12 10:42:54

+0

是的,我看到一些gui框架使用這種系統 – davivid 2012-04-12 17:46:31

回答

0

如果你希望你的GUI框架,是對大家有用,你應該使用標準的事件,而不是發明新的。第二種選擇是要走的路,但你應該儘量保持簡單。例2中編寫的代碼看起來非常複雜。它可以簡單地這樣寫的是:

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

我懷疑這可以用於高級控件,它可能實際上由許多組件組成。沒有標準的事件會有意義嗎?例如,採取由x/y推子和多個複選框組成的控制,您會聽到什麼事件?另外,如果你傳遞了所有要發送的事件,那麼對於控制器來監聽GUI容器並處理它們,是不是更有意義? – davivid 2012-04-12 10:10:06

+0

對於像點擊這樣基本的事情,使用已定義的事件而不是強迫用戶學習新事件是有意義的。如果一個組件更復雜,當然你可能需要創建自定義事件。 – 2012-04-12 11:52:29

+0

事件對異步操作和控制更好。在這個簡單的按鈕的情況下可能會好,但考慮TextFields,滑塊,複選框和其他工具。你總是可以寫行item.addEventListener(...);和創建函數doSmth(e:Event),我會make item.bind(target,key);節省大量的時間和寫作。 – turbosqel 2012-04-12 12:54:58

0

稍微offtopic,而不是一個真正的回答你的問題:

public class Button extends Sprite 
{ 

    public function Button(label:String) 
    { 
    } 

} 

那麼任何人都可以使用他們知道事件處理點擊爲什麼重新創建已經存在的東西?已經有經過驗證的GUI組件庫。

例如,採取AS3寺庫
http://code.google.com/p/templelibrary/

它具有所有類型的形式元件組件; checkbox,radiobutton,combobox,inputfield,filefield,scrollcomponent,日期選擇器,(步)滑塊,列表,滾動條,自動填充字段和所有類型的按鈕。 它也有一個Form類,這有助於驗證,將數據傳遞給任何類型的服務。它也管理tabindexes的權利,所有的控制也可以與鍵盤一起使用,就像每個人都希望它能夠工作一樣。也有一些模型的代碼組件,但是您可以使用相同的代碼來創建樣式,使用庫項目,時間軸或您想要的無窮創意。大多數gui組件的設計都是爲了使它們可以擴展以適應您的需求。

大部分的GUI組件的工作與正常事件監聽器,在大多數情況下,沒有必要把它包裝成新類型的事件(當含量變化最調度Event.CHANGE)。

+0

感謝您的鏈接。但是要回答你的問題 - 因爲我將這作爲學習練習,也因爲我的許多組件與我迄今爲止在許多圖書館中看到的內容相差甚遠。 – davivid 2012-04-13 12:16:29