JavaFX 在 EventHandler 中使用超类
JavaFX use superclass in EventHandler
我有多个控制器-classes,它们扩展了另一个控制器。当我在扩展控制器中创建事件处理程序时-class,我无法使用"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 是相对引用。
当从 testMethod
引用 super 时,super 是 ViewController
,但当从 createBtnHandler
引用 super 时,super 是 EventHandler
super class。
(事件处理程序继承自对象,因此对象将是超级对象)
参见 - https://docs.oracle.com/javase/8/javafx/api/javafx/event/EventHandler.html
要完成这项工作,您可以创建一个继承 EventHander
的 class 并传递对您要调用的方法的引用。
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());
}
}
这里不用super
。如果你遗漏了 super.
,java 编译器会检查匿名 class 中是否有 getIdField
方法,因为它没有找到,它会检查包含的 class 对于这种方法。 (在 testMethod
中使用 super
或 this
不会改变结果,因为 getIdField
不会在 ExtendingViewController
中被覆盖。)
testLabel.setText(getIdField().getText());
然而,您可以使用 ContainingClass.super
:
访问包含 class 的 superclass 的成员
private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
testLabel.setText(ExtendingViewController.super.getIdField().getText());
}
};
我有多个控制器-classes,它们扩展了另一个控制器。当我在扩展控制器中创建事件处理程序时-class,我无法使用"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 是相对引用。
当从 testMethod
引用 super 时,super 是 ViewController
,但当从 createBtnHandler
引用 super 时,super 是 EventHandler
super class。
(事件处理程序继承自对象,因此对象将是超级对象)
参见 - https://docs.oracle.com/javase/8/javafx/api/javafx/event/EventHandler.html
要完成这项工作,您可以创建一个继承 EventHander
的 class 并传递对您要调用的方法的引用。
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());
}
}
这里不用super
。如果你遗漏了 super.
,java 编译器会检查匿名 class 中是否有 getIdField
方法,因为它没有找到,它会检查包含的 class 对于这种方法。 (在 testMethod
中使用 super
或 this
不会改变结果,因为 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());
}
};