JavaFX在EventHandler中使用超类
我有多个控制器类,它们扩展了另一个控制器。在扩展控制器类中创建EventHandler时,不能使用“super.something”。它在普通方法中工作,但在EventHandler中不工作。还有其他选择吗 下面是一个小例子摘录:JavaFX在EventHandler中使用超类,java,inheritance,javafx,extends,super,Java,Inheritance,Javafx,Extends,Super,我有多个控制器类,它们扩展了另一个控制器。在扩展控制器类中创建EventHandler时,不能使用“super.something”。它在普通方法中工作,但在EventHandler中不工作。还有其他选择吗 下面是一个小例子摘录: public class ViewController { @FXML private TextField idField; public TextField getIdField() { return idField;
public class ViewController {
@FXML
private TextField idField;
public TextField getIdField() {
return idField;
}
}
-
公共类扩展ViewController扩展ViewController{
@FXML
自有品牌testLabel;
私有EventHandler createBtnHandler=新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
//这不起作用。这种方法中似乎不存在“超级”。
testLabel.setText(super.getIdField());
}
};
}
公共void testMethod(){
//这确实有效
testLabel.setText(super.getIdField());
}
}
这不起作用,因为super是一个相对引用。
从testMethod
super引用super时,super是ViewController
,但从createBtnHandler
super引用super时,super是EventHandler
超类。
(事件处理程序从对象继承,因此对象将是超级对象)
见-
为了实现这一点,您可以创建一个继承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());
}
}
公共类CustomEventHandler实现EventHandler{
私有的IEventsHandler-mEventsHandler;
公共CustomEventHandler(IEventsHandler eventsHandler)
{
mEventsHandler=eventsHandler;
}
@凌驾
公共无效句柄(ActionEvent事件){
mEventsHandler.testMethod();
}
}
公共接口IEventHandler{
void testMethod();
}
公共类ExtendingViewController扩展ViewController实现IEventHandler{
@FXML
自有品牌testLabel;
private EventHandler createBtnHandler=新的CustomEventHandler(此);
公共void testMethod(){
testLabel.setText(super.getIdField());
}
}
这里不需要使用super
。如果省略了super.
,java编译器将检查anonymus类中是否有getIdField
方法,并且由于找不到该方法,因此会检查包含该方法的类。(在testMethod
中使用super
或此不会更改结果,因为getIdField
在ExtendingViewController
中不会被覆盖)
但是,您可以使用ContainingClass.super
访问包含类的超类的成员:
private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
testLabel.setText(ExtendingViewController.super.getIdField().getText());
}
};
private EventHandler createBtnHandler=new EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
testLabel.setText(ExtendingViewController.super.getIdField().getText());
}
};
如果没有super.
,它能工作吗?实际上,在这个问题中使用的EventHandler
不是这个,而是这个。
testLabel.setText(getIdField().getText());
private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
testLabel.setText(ExtendingViewController.super.getIdField().getText());
}
};