【问题标题】:Create New Tab With its own FXML使用自己的 FXML 创建新选项卡
【发布时间】:2016-07-06 14:00:29
【问题描述】:

我有一个通过 FXML 声明的 TabPane。我正在尝试动态添加新标签。

我为这些标签创建了一个单独的类:

public class DetailTab extends Tab {

我的 Controller.java 正在生成新的 DetailTab 并将它们添加到我的 TabPane:

detailsPane.getTabs().add(new DetailTab(title));

在 DetailTab.java 中,我尝试使用不同的 FXML 文件填充新选项卡的内容,具体取决于传递给 DetailTab 构造函数的字符串。

try {
                System.out.println("Trying fxml");
                this.setContent(FXMLLoader.load(getClass().getResource("tabUserComments.fxml")));
            } catch (Exception e) {
                e.printStackTrace();
            }

这会创建一个 NullPointerException。 tabUserComments.fxml 文件与 DetailTab.java 一起位于项目的根目录中。

IntelliJ project structure

最好的方法是什么?我什至可以从 DetailTab 本身将内容设置为 FXML 文件吗?如果可能的话,我想避免使用控制器来设置选项卡的内容。

【问题讨论】:

  • 您似乎想要局部视图,我认为 javafx 不支持,除了当您使用相同的后备控制器加载不同的 fxml 文件时,将创建控制器的新实例,它们不会共享相同的实例/状态
  • 如有必要,我很乐意为每个单独的选项卡的 fxml 创建一个单独的控制器。我确实注意到如果我为 tabUserComments.fxml 分配不同的控制器,异常就会清除。但是,现在我看到该选项卡仍未由新的 fxml 数据填充。
  • 那么有没有更好的方法来使用单独的 fxml 文件填充选项卡?我计划有很多选项卡,并且更愿意单独设计它们,而不是让我的 DetailTab 类膨胀,每个选项卡都有所有不同的代码。
  • 不完全相关,但你可以看到here
  • 查看 FXML 文档简介的 Custom components 部分。

标签: java intellij-idea javafx fxml


【解决方案1】:

我能够通过在我的 DetailsTab.java 类中使用以下代码获得部分解决方案:

try {
                FXMLLoader loader = new FXMLLoader(getClass().getResource("tabUserComments.fxml"));
                loader.setController(this);
                this.setContent(loader.load());

            } catch (Exception e) {
                e.printStackTrace();
            }

这仍然会导致问题,因为我无法访问 tabUserComments.fxml 的控件中包含的数据。但是,我会将其标记为已回答,因为数据的传递完全是另一个问题;这确实允许使用单独的 FXML 文件设计每个选项卡。

【讨论】:

  • loader.setController(this); 弄乱控件和控制器是一种难闻的气味恕我直言
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2023-01-25
  • 1970-01-01
相关资源
最近更新 更多