JavaFX 可重用 FXML 片段

2024-02-07

我正在实现一个选项卡式部分,其中每个选项卡将包含一个表视图。在此表视图中,无论选择哪个选项卡,都会呈现一个列子集,但某些选项卡将包含其他列(以编程方式处理)。

由于这些原因,每个选项卡都需要有一个单独的控制器,但我想知道是否可以在每个选项卡中重用选项卡 FXML 的内部内容,而无需复制和粘贴代码。我正在考虑一个可重用组件,我可以在另一个 FXML 文件中定义该组件,然后将其包含在选项卡部分中。

具体来说,我希望将下面代码中的内容部分放在一个文件中,并在每个文件中引用它,这样如果我将来想更改某些内容,就不必对多个文件进行更改。我认为这可以通过编程来实现,但如果可能的话,我更喜欢 FXML 解决方案。

<Tab xmlns:fx="http://javafx.com/fxml/1"
     xmlns="http://javafx.com/javafx/8"
     fx:controller="com.SpecificController"
     id="specificTab" text="Specific Tab Name">

    <content>
        <JFXTreeTableView fx:id="commonTableView" VBox.vgrow="ALWAYS">
            <columns>
                <JFXTreeTableColumn fx:id="nameColumn" text="Name"/>
                <JFXTreeTableColumn fx:id="positionColumn" text="Position"/>
                <JFXTreeTableColumn fx:id="teamColumn" text="Team"/>
                <JFXTreeTableColumn fx:id="selectColumn" text="Select"/>
            </columns>
        </JFXTreeTableView>
    </content>
</Tab>

我绝不是 JavaFX 专家,但我能够想出这个解决方案。

这是一个 MCVE,因此您可以完全重新创建此示例应用程序并运行它以查看其实际情况。

该示例使用AnchorPane对于可重用的 FXML 节点,但您可以修改它以使用Tab反而。不过,我发现重用内容本身要简单一些。

我正在使用一个简单的Interface定义我们的选项卡控制器;这允许我们编写一种方法来设置每个内容和单独的控制器Tab.


主要.java:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        try {
            // Load the main layout
            FXMLLoader loader = new FXMLLoader(getClass().getResource("MainLayout.fxml"));

            // Show the Stage
            primaryStage.setWidth(700);
            primaryStage.setHeight(500);
            primaryStage.setScene(new Scene(loader.load()));
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

FXML 文档:

MainLayout.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1"
            xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.reusableTabs.MainController">
    <VBox alignment="TOP_CENTER" prefHeight="400.0" prefWidth="600.0" spacing="10.0" AnchorPane.bottomAnchor="0.0"
          AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <padding>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
        </padding>
        <Label style="-fx-font-size: 150%; -fx-font-weight: bold;" text="Reusable Tab Content Sample"/>
        <Separator prefWidth="200.0"/>
        <TabPane fx:id="tabPane" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE"
                 VBox.vgrow="ALWAYS">
            <Tab fx:id="tab1" text="Tab #1"/>
            <Tab fx:id="tab2" text="Tab #2"/>
            <Tab fx:id="tab3" text="Tab #3"/>
        </TabPane>
    </VBox>
</AnchorPane>

选项卡内容.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
            prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1">
    <VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" AnchorPane.bottomAnchor="0.0"
          AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <Label text="Look - reusable Tab contents!"/>
        <Button fx:id="btnTestController" mnemonicParsing="false" text="Test Controller"/>
        <padding>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
        </padding>
    </VBox>
</AnchorPane>

控制器:

主控制器.java:

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;

import java.io.IOException;

public class MainController {

    @FXML
    private TabPane tabPane;
    @FXML
    private Tab tab1;
    @FXML
    private Tab tab2;
    @FXML
    private Tab tab3;

    @FXML
    private void initialize() {

        // Our TabPane has 3 Tabs. Let's populate them with content, reusing our TabContent.fxml file
        setTabContent(tab1, new Tab1Controller());
        setTabContent(tab2, new Tab2Controller());
        setTabContent(tab3, new Tab3Controller());

    }

    /**
     * Sets the content of Tab to the TabContent.fxml document
     *
     * @param tab        The Tab whose content we wish to set
     * @param controller The controller for this particular Tab's content
     */
    private void setTabContent(Tab tab, TabController controller) {

        // Load our TabContent.fxml file and set it as the content of the Tab that was passed to this method
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("TabContent.fxml"));

            // Set the controller for this specific tab
            loader.setController(controller);

            // Set the content of the passed Tab to this FXML content
            tab.setContent(loader.load());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Tab1控制器:

import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class Tab1Controller implements TabController {

    @FXML
    private Button btnTestController;

    @FXML
    private void initialize() {

        // Set our button to print out which controller is being used
        btnTestController.setOnAction(event -> System.out.println("Hello, from Controller #1!"));

    }
}

只需再重复此控制器两次即可Tab2Controller.java和`Tab3Controller.java


结果:

单击Test Controller按钮将打印出来Hello, from Controller #2!,确认每个选项卡的内容都由它们自己的控制器控制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 可重用 FXML 片段 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • 从 C# 调用方中的非托管 DLL 捕获标准输出

    我有一个 C 应用程序通过一些 C CLI 编组代码调用本机 C DLL C gt C CLI gt C 无 CLR 我希望 DLL 在运行时将字符串更新发送回调用应用程序 目前 非托管 DLL 将输出写入 stdout 本质上我需要在 U
  • AngularJs 将 HTML 中每个 ng-repeat 的实例传递给指令

    我认为这应该很简单 但我错过了一些东西 我怎样才能通过flowObj in my ng repeat下面是我的指令 我想将它传递给我的指令 然后单击 使用它FlowObj 然后应用一些逻辑 我尝试在我的指令中使用注释代码 scope tes
  • Ruby:为什么我不能创建新文件?

    我正在尝试创建一个 json 文件并写入它 我的代码如下所示 def save as json object f File new file json f puts object to json w f close end save as
  • android-support-v4 删除未使用的类

    实际上 我正在尝试将应用程序的 apk 缩小到尽可能小的大小 我目前导入了 android support v4 jar 文件 我的问题是 如何从此 jar 文件中删除未使用的类 经过一番搜索后没有找到任何信息 如果 ProGuard 是解
  • 如何使用 Salt 创建 SHA256 哈希?

    我目前正在开发一个 Visual Studio C Windows 窗体项目 但是 我对 SHA256 salted 的工作原理感到困惑 我在网上找到了一些例子 但无法理解如何调用这个函数 我想在连接到数据库 Microsoft Acces
  • 如何在 ag-grid 表的页脚中启用或显示总行数

    我正在使用 Ag Grid 表 我想在表的页脚中显示总行 我如何通过使用 2 个表来实现它 第 1 个表用于实际数据 第 2 个表用于总计行 它与普通的不可滚动表格一起工作正常 但如果它是固定或可滚动表格 则顶部表格会滚动 但底部表格会粘在
  • 在 HashMap 或 LinkedList 中将嵌套类设为静态的原因是什么? [复制]

    这个问题在这里已经有答案了 在大多数情况下 我看到嵌套类是static 让我们举个例子Entry上课于HashMap static class Entry
  • Protractor browser.wait 不等待

    我假设 browser wait 应该是一个阻塞调用 但它没有按我的预期工作 这是我的样本 describe browser wait function beforeEach function browser wait function c
  • 问题:使用 Windows 7,运行我的应用程序时出现未经授权的访问异常

    我的应用程序引发未经授权的访问错误 运行我的应用程序时 我尝试访问以下位置的目录 Application UserAppDataPath 问题 它说我无权访问 Application UserAppDataPath 目录 有没有办法在我的应
  • pyqtgraph:同步不同图中轴的缩放

    我想同步几个 pyqtgraph 图的 X 轴 当用户通过鼠标交互重新缩放 X 轴时 例如 鼠标在 x 轴上时滚动滚轮 我想将相同的更改分配给所有其他绘图 那么我该怎么做呢 我从下面的基本示例中导出了最小化代码 我是否必须覆盖viewRan
  • 在 html 表 中将单行加粗 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我使用以下
  • 来自 iOS 的 Instagram 签名 API 调用

    对 Instagram 帖子方法进行签名 API 调用以关注用户 点赞用户的图像等 用户每小时的关注次数限制为 20 次 但如果我们进行签名 API 调用 那么用户每小时可以进行 60 次关注 但我的问题是如何进行签名 API 调用 我尝试
  • 限制 Apigility 中的结果

    我使用 Apigility 创建了一个代码连接 API 现在我正在使用标准创建存根 在我的PostResource有一种方法叫做fetchAll params array 我为该方法创建了代码 以便它返回一组可分页的结果 var Hydra
  • 在 MySQL 中查找同一个表中的重复项

    我有一个包含两列的表 艺术家 release id 我可以运行什么查询来显示重复记录 例如我的桌子是 ArtistX 45677 ArtistY 378798 ArtistX 45677 ArtistZ 123456 ArtistY 888
  • 显示ajax、Jquery返回的响应的html代码

    我有一个 jquery AJAX 函数 它检索一些 HTML 标记并将其显示在页面上 我还想显示返回的 HTML 的 html 代码 我四处寻找解决方案 但没有找到任何解决方案 有人可以帮忙吗 非常感谢 post get news php
  • 4x4 矩阵预乘和后乘

    我有以下功能 void Matrix Scale const float xScale const float yScale const float zScale Matrix scaleMatrix scaleMatrix m data
  • 如何查明某个函数被 javascript/jquery 调用了多少次?

    也许是一个奇怪的问题 但事实是 我有一个定期调用的函数 在该函数中我需要知道我处于哪个迭代中 或者该函数被调用了多少次 问题的简化版本 jQuery document ready function setInterval myFunctio
  • 有没有办法让 HTML5 数据列表使用模糊搜索?

    我有一组数据列表选项 我想在搜索时进行模糊匹配 例如 如果我输入 PHP HTML 或 PHPAndHTML 我希望其中任何一个与 PHP And HTML 选项匹配 有什么办法可以做到这一点吗 请参见这把小提琴 https jsfiddl
  • JavaScript + MVC + 用户界面

    我正在寻找新的 JavaScript 编程方法 我的目标是创建像 GMail 这样的 JavaScript 应用程序 我尝试过 GWT 但它看起来很复杂 而且代码也不时尚 我发现 MVC 模式是一种很好的编程方式 我总是在用 javascr
  • JavaFX 可重用 FXML 片段

    我正在实现一个选项卡式部分 其中每个选项卡将包含一个表视图 在此表视图中 无论选择哪个选项卡 都会呈现一个列子集 但某些选项卡将包含其他列 以编程方式处理 由于这些原因 每个选项卡都需要有一个单独的控制器 但我想知道是否可以在每个选项卡中重