[英]JavaFX use superclass in EventHandler
我有多個控制器類,它們擴展了另一個控制器。 當我在擴展控制器類中創建EventHandler時,不能使用“ super.something”。 它可以在常規方法中工作,但不能在EventHandler中工作。 還有其他選擇嗎?
這是一個小例子摘錄:
public class ViewController {
@FXML
private TextField idField;
public TextField getIdField() {
return idField;
}
}
-
public class ExtendingViewController extends ViewController {
@FXML
private Label testLabel;
private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
//This does not work. "super" does not seem to exist in this method.
testLabel.setText(super.getIdField());
}
};
}
public void testMethod(){
//this does work
testLabel.setText(super.getIdField());
}
}
這里沒有必要使用super
。 如果您忽略了super.
,則Java編譯器會在匿名類中檢查一個getIdField
方法,由於找不到一個方法,因此它將檢查此方法的包含類。 (在testMethod
中使用super
或this
不會更改結果,因為在ExtendingViewController
不會覆蓋getIdField
。)
testLabel.setText(getIdField().getText());
但是,您可以使用ContainingClass.super
訪問包含類的超類的成員:
private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
testLabel.setText(ExtendingViewController.super.getIdField().getText());
}
};
這是行不通的,因為super是相對引用。 從testMethod
引用super時, ViewController
是super,而從createBtnHandler
super引用super時, createBtnHandler
是EventHandler
超類。 (事件處理程序從對象繼承,因此對象將是超級對象)。請參見-https://docs.oracle.com/javase/8/javafx/api/javafx/event/EventHandler.html
為了完成這項工作,您可以創建一個繼承EventHander
的類,並傳遞對您要調用的方法的引用。
public class CustomEventHandler implements EventHandler<ActionEvent> {
private IEventsHandler mEventsHandler;
public CustomEventHandler(IEventsHandler eventsHandler)
{
mEventsHandler = eventsHandler;
}
@Override
public void handle(ActionEvent event) {
mEventsHandler.testMethod();
}
}
public interface IEventsHandler {
void testMethod();
}
public class ExtendingViewController extends ViewController implements IEventsHandler {
@FXML
private Label testLabel;
private EventHandler<ActionEvent> createBtnHandler = new CustomEventHandler(this);
public void testMethod(){
testLabel.setText(super.getIdField());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.