1 回答

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