我有多个控制器类,它们扩展了另一个控制器。当我在扩展控制器类中创建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());
}
}
答案 0 :(得分:2)
这里不需要使用super
。如果省略了super.
,则Java编译器将检查匿名类中的getIdField
方法,由于找不到该方法,因此它将检查此方法的包含类。 (在super
中使用this
或testMethod
不会改变结果,因为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());
}
};
答案 1 :(得分:0)
这不起作用,因为super是相对引用。
从testMethod
引用super时,ViewController
是超级,而从createBtnHandler
引用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());
}
}