2012-07-12 114 views
2

我已經開始嘗試創建正常的MVC Swing組件。我對M和C沒有任何問題,但V給我帶來了一個我通常無法解決的問題。 問題是:控制器是組件的主要類(例如MyComponent),它擴展了JComponent。 View是從ComponentUI類擴展的ui委託(MyCompanentUI)。委託所做的是在MyCompanent中添加JTextField,並在MyComponentModel和該字段之間提供數據綁定。它工作得很好。但是我怎樣才能將事件從JTextField綁定到MyComponent? 如果用戶想要處理某些事件,他會將偵聽器添加到MyComponent,但是所有由JTextField攔截的真實事件(鼠標,焦點,鍵等)都是關於哪個用戶不知道的。 那麼是否有任何正常的方法來做到這一點,除了捕捉事件並用手將其翻譯爲原始組件?或者還有另一種創建委託的方式,我真的完全錯了嗎?JComponent和ComponentUI委託之間的綁定事件

UPD:

感謝您的迴應,垃圾內容。 但我腦子裏有不同的東西。我在談論像「事件繼承」這樣的事情,就像「繼承PupupMenu」方法一樣。因此,那麼鍵,焦點或鼠標事件發生在組件本身並不處理它,而是直接將其轉移到父組件。但這似乎是不可能的,因爲我注意到JSpinner有完全相同的問題 - 你幾乎不能從這個組件獲得任何事件通知。

回答

2

如果您正在編寫自己的JComponent子類,並希望允許自定義用戶界面代表,我會從Kirill Grouchnikov的How to Write a Custom Swing Component開始。

如果正在編寫的複合,其包括現有JComponent子類,如JTextField,看看是否可以利用在How to Use Key Bindings描述的現有Action實例。 ScrollAction就是一個例子。您可以從組件的源代碼或使用文章Key Bindings中的@camickr's方便實用程序瞭解此類操作的名稱。

+0

在'JSpinner'的特定情況下,您可以在'SpinnerModel'上註冊一個監聽器。更一般地說,您可以使用類似的[體系結構](http://java.sun.com/products/jfc/tsc/articles/architecture/)。 – trashgod 2012-07-13 17:30:58