簡體   English   中英

JavaFX在EventHandler中使用超類

[英]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中使用superthis不會更改結果,因為在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時, createBtnHandlerEventHandler超類。 (事件處理程序從對象繼承,因此對象將是超級對象)。請參見-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM