如何创建从另一个加载fxml文件的java类继承的java类

如何创建从另一个加载fxml文件的java类继承的java类,java,javafx-2,Java,Javafx 2,我有一个在scene builder中创建的自定义接口,我想在使用子类创建的变体中重用它。问题似乎是它不会继承用@FXML标记的方法。有没有办法扩展加载fxml的类而不是复制整个类 父类示例: public class Browser extends StackPane implements Initializable { public Browser() { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml

我有一个在scene builder中创建的自定义接口,我想在使用子类创建的变体中重用它。问题似乎是它不会继承用@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”找不到。

将我的注释转换为答案


我对fxml没有任何经验,但您可以尝试扩大该方法的访问权限,例如从
private
扩展到
protected

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


这背后的一个原因是私有方法名称永远不会引起冲突:基类和派生类中可以有两个同名的私有方法,但两个方法彼此都不知道。他们互相攻击。就派生类而言,父类中的方法根本不存在。因为这是一个合理的工作原则,所以框架也应该遵循这一原则,即使绕过访问限制会允许它们采取其他行动。

你说的“它不会继承”是什么意思?您的具体问题是什么?我以前见过这个问题,因为我忘记将fxml文件中引用的方法放入控制器类中。这里的问题是控制器方法位于父类中,父类是控制器类,但子类似乎没有继承它。我对fxml没有任何经验,但您可以尝试扩大对该方法的访问权限,例如扩展到受保护的。如果真是这样的话,那么你可以调查这种访问限制是设计的,还是意外的,或者甚至是可配置的。谢谢,这是有效的!把它写下来作为答案,我会记下来的。我完全忘记了这一点。有时候,需要一双新的眼睛才能看到眼前的一切。