2016-11-25 56 views
0

在JavaFx中,我明白如果我想讓一個按鈕在點擊時運行一些代碼,我需要以某種方式讓我想要在代碼中運行的代碼,並且因爲這是Java,所以我包裝了該方法在擴展EventHandler的類中。例如:爲什麼設計JavaFX事件處理是爲了創建一個持有handle()方法的類的實例?

// (myButton is a reference variable to a Button object) 
myButton.setOnAction(new MyButtonEventHandlerClass()); 

// inner class 
public class MyButtonEventHandlerClass extends EventHandler<ActionEvent>{ 
    public void handle(ActionEvent e) { 
    // (some code) 
    } 
} 

我的困惑是:爲什麼JavaFX的設計要求我創建一個持有handle()方法的類的實例?我曾經認爲在使用對象的實例變量時會使用非靜態方法;換句話說,如果你只需要一個不需要對象的方法,那麼你應該使用靜態方法。在這種思想中,handle()聽起來應該是一個靜態方法。

爲什麼handle()不是靜態方法?

回答

1

EventHandler在這種情況下一個有意義的方式工作的標準是:

  1. 需要有某種方式來存儲信息。
  2. 必須以允許多種方式處理事件的方式存儲信息。

現在不管handle方法實際使用的任何字段EventHandler和/或外部類的,需要有一種方法做標識應處理該事件的代碼。
如果handle只是一個static方法,那麼只會有一個處理程序,更糟的是由JavaFX程序員決定,因爲static方法不能被覆蓋。如果沒有非static方法,將不可能滿足條件2.

對於非靜態方法,處理這個非常簡單。方法可以被覆蓋,通過爲事件處理程序對象調用EventHandler.handle來完成處理事件的正確方法。


在java中8然而方法的引用(或lambda表達式)可以被用於通過使用方法的引用,它允許你「使用的方法作爲接口實例」有點縮短這個:

public class MyClass { 

    public static void handleMyButtonAction(ActionEvent evt) { 
     // (some code) 
    } 

} 
myButton.setOnAction(MyClass::handleMyButtonAction); 
+0

啊,我沒有意識到,非靜態方法不能被覆蓋。謝謝! – silph

相關問題