1 回答

TA貢獻2065條經驗 獲得超14個贊
回答
除了兩個問題外,您似乎已正確設置所有內容。
你永遠不會添加一個EventHandler監聽你的事件的。
實現任意接口不會使您的對象對您的自定義事件做出反應。事件處理系統不知道你的接口,甚至不知道你已經實現了它。如果您希望onMyEvent()在事件到達標簽時調用您的方法,則需要執行以下操作:
public MyLabel() {
//...
addEventHandler(MyEvent.MY_EVENT, event -> onMyEvent());
}
請注意,我使用addEventHandler的是類本身不依賴于該onMyEvent屬性。如果您依賴該屬性,則外部代碼可能會通過替換EventHandler.
這讓我想知道MyEventListener接口是否真的有必要。你不能在里面做你需要的EventHandler嗎?
您實際上從未觸發過您的MyEvent.
您目前擁有:
btnSender.setOnAction(e -> MyEvent.fireEvent(lblReceiver, e));
這只是將e(an ActionEvent) 重新點燃到lblReceiver. 該fireEvent方法是由static聲明的方法javafx.event.Event。為方法調用加上前綴MyEvent不會改變此處實際調用的方法。將其更改為以下內容:
btnSender.setOnAction(e -> Event.fireEvent(lblReceiver, new MyEvent()));
// or...
btnSender.setOnAction(e -> lblReceiver.fireEvent(new MyEvent()));
// The second option is a convenience method and simply forwards to Event.fireEvent
為了在您的標簽上實際觸發您自己的事件類的實例。
事件派發基礎
JavaFX 中的事件處理有兩個階段:
捕獲階段
第一階段。在這里,事件從其路徑的起點向下傳播到目標。在此過程中的每一步,都會調用適當的事件過濾器。過濾器是通過諸如
Node.addEventFilter(EventType,EventHandler)
.冒泡階段
第二階段。在這里,事件從目標返回到路徑的起點。在此過程中的每一步,都會調用適當的事件處理程序。處理程序是通過諸如 和 之類的方法和
Node.addEventHandler(EventType,EventHandler)
屬性添加的。Node.onKeyPressed
ButtonBase.onAction
事件處理由以下組件組成:
javafx.event.Event
(和子類)實際對象傳遞過來。攜帶與事件相關的信息(例如
MouseEvent
s 的光標位置)。一個
Event
也攜帶來源。但是,來源是動態的;它始終是EventHandler
當前處理事件的對象。因此,EventHandler
添加到 a的事件Button
將具有Button
作為事件源的事件,但同一事件將具有父級作為EventHandler
添加到父級的源。即使您EventHandler
兩次使用同一個實例,此行為也不會改變。細化一類的含義
Event
。例如,MouseEvent
帶有MOUSE_PRESSED
類型的 a 毫不奇怪地表示鼠標被按下了。一個EventType
有一個超類型;這為每種事件形成了所有類型的層次結構。為超類型注冊的處理程序也將收到子類型的通知。不能有兩個或多個
EventType
具有相同超類型和名稱的 s。這就是為什么實例通常public static final
是相應事件類的字段。處理其注冊的任何事件。這是一個功能接口(可以是 lambda 表達式或方法引用的目標)。執行應用程序級工作的是此接口的實現(即,在觸發按鈕時執行某些操作)。
負責將事件分派給適當的處理程序。每個能夠成為事件目標的對象通常都有自己的調度程序。例如,每個
Window
、Scene
和Node
instance 都有自己的EventDispatcher
實例(保存在屬性中)。注意:在高度專業化的情況之外,您永遠不必直接處理此接口。
表示事件在目標處觸發時將采用的路徑。此接口的實例用作
EventDispatcher
s 的堆棧。觸發事件時,將根據事件的目標創建和配置新鏈。在場景圖和目標是 a 的情況下Node
,堆棧由EventDispatcher
屬于 s的 s 組成Window
,Scene
然后每個Node
向下到(父到子)并包括目標。事件沿這條鏈向下傳播(捕獲階段),然后返回這條鏈(冒泡階段)。注意:您可能永遠不需要直接使用此界面。
事件的實際目標。該
EventTarget
接口具有一種用于構建EventDispatchChain
. 換句話說,目標決定了事件的路徑。這是中的第一個參數Event.fireEvent(EventTarget,Event)
。注意:如果您正在創建一個可以(顯然)成為事件目標的對象(并且您的對象不是從 的實現擴展的
EventTarget
),則只需要使用此接口。
添加回答
舉報