【问题标题】:JavaFX use superclass in EventHandlerJavaFX 在 EventHandler 中使用超类
【发布时间】:2019-04-12 02:45:37
【问题描述】:

我有多个控制器类,它们扩展了另一个控制器。当我在扩展控制器类中创建 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. 是否可以工作?

标签: java inheritance javafx extends super


【解决方案1】:

这里不需要使用super。如果你忽略了super.,java 编译器会检查匿名类是否有getIdField 方法,因为它没有找到,它会检查包含这个方法的类。 (在testMethod 中使用superthis 不会改变结果,因为getIdField 不会在ExtendingViewController 中被覆盖。)

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());
    }
};

【讨论】:

    【解决方案2】:

    这不起作用,因为 super 是一个相对引用。 当从testMethod 引用super 时,super 是ViewController,但是当从createBtnHandler 引用super 时,super 是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());
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多