0

我有一个在场景构建器中创建的自定义界面,我想在使用子类创建的变体中重用它。问题似乎是它不会继承标有@FXML 的方法。有没有办法扩展一个加载 fxml 而不是复制整个类的类?

示例父类:

public class Browser extends StackPane implements Initializable {

public Browser() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml/Browser.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}

@Override
public void initialize(URL url, ResourceBundle rb) {
}

// Adds a new tab.
@FXML
private void addTab(ActionEvent event) {
    BrowserTab tab = new BrowserTab();
    tab.getEngine().load(initialTab.getAddress());
    if (tabs.getTabs().size() >= TABMAX + 1) {
        BaseApp.showNotify("You may open a maximum of " + TABMAX + " tabs.");
    } else {
        tabs.getTabs().add(tabs.getTabs().size() - 1, tab.tab);
    }
}
}

示例子类:

public class AdBrowser extends Browser {

public AdBrowser() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml/AdBrowser.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);
    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

}

当我尝试运行实例化子类的程序时,我得到并错误提示找不到控制器方法“addTab”。

4

1 回答 1

2

将我的评论变成答案。

我完全没有使用 fxml 的经验,但是您可以尝试扩大对该方法的访问权限,例如 from privateto protected

定义private方法的类之外的代码通常不允许调用该方法。一些框架规避了这些限制,也许 javafx 就是其中之一。但即使是这些框架也可能并且经常会根据给定方法具有的访问权限进行区分。

这背后的一个原因是私有方法名称永远不应该引起冲突:您可以在基类和派生类中拥有两个同名的私有方法,而彼此都不知道。它们不会相互覆盖。就派生类而言,父类中的方法根本不存在。由于这是一个合理的工作原则,框架遵循这一点也是有意义的,即使规避的访问限制允许它们采取其他方式。

于 2013-07-31T21:09:51.457 回答