我有一个在场景生成器中创建的自定义界面,我想在使用子类创建的变体中重用它。问题似乎是它不会继承标有@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);
}
}
}
当我尝试运行实例化子类的程序时,我收到错误消息,提示找不到 Controller 方法“addTab”。
最佳答案
将我的评论变成答案。
我对 fxml 没有任何经验,但您可以尝试扩大对该方法的访问权限,例如从私有(private)
到 protected
。
定义私有(private)
方法的类外部的代码通常不允许调用该方法。一些框架规避了这些限制,也许 javafx 就是其中之一。但即使这些框架也可能并且经常会根据给定方法具有的访问权限进行区分。
这背后的一个原因是私有(private)方法名称永远不应该引起冲突:基类和派生类中可以有两个同名的私有(private)方法,并且两者都不知道对方。他们will not override另一个。对于派生类来说,父类中的方法根本不存在。由于这是一个合理的工作原则,因此框架也遵循这一原则是有意义的,即使规避访问限制将允许它们采取其他行动。
关于java - 如何创建一个继承另一个正在加载 fxml 文件的 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977829/