在 Jar 中为 Gluon Scene Builder 11.00 创建自定义控件

2024-05-10

我想在可执行 jar 文件中创建自定义控件,然后在 Gluon Scene Builder 11.00 中使用。我需要知道如何做到这一点。我尝试了几种形式,但在场景生成器中导入 jar 时我的控件没有出现。我正在使用 IntelliJ Community Edition 2019.2、Gluon Scene Builder 11.00 和 Java 12.0.2。有人可以帮我举个小例子吗?

Maven 项目。

自定义控制.fxml

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>

<fx:root maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="51.0" prefWidth="138.0" type="VBox" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <TextField fx:id="textField" />
      <Button mnemonicParsing="false" onAction="#doSomething" prefHeight="25.0" prefWidth="142.0" text="Clck Me" />
   </children>
</fx:root>

自定义控件.java

package customcontrolexample;

import java.io.IOException;

import javafx.beans.property.StringProperty;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;

public class CustomControl extends VBox {
    @FXML private TextField textField;

    public CustomControl() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(
                "custom_control.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }

    public String getText() {
        return textProperty().get();
    }

    public void setText(String value) {
        textProperty().set(value);
    }

    public StringProperty textProperty() {
        return textField.textProperty();
    }

    @FXML
    protected void doSomething() {
        System.out.println("The button was clicked!");
    }
}

自定义控件示例.java

import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class CustomControlExample extends Application {

    private static Scene scene;

    @Override
    public void start(Stage stage) throws IOException {
        CustomControl customControl = new CustomControl();
        customControl.setText("Hello!");
        stage.setScene(new Scene(customControl));
        stage.setTitle("Custom Control");
        stage.setWidth(300);
        stage.setHeight(200);
        stage.show();
    }

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

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>customcontrol</groupId>
    <artifactId>CustomControlExample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>12.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>12.0.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.3</version>
                <configuration>
                    <mainClass>CustomControlExample</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.1</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>CustomControlExample</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

当您想要创建可以使用场景生成器导入的自定义控件时,需要考虑一些事项。

什么是自定义控件

没有关于此的文档,但您可以查看当前的场景生成器中的源代码 https://github.com/gluonhq/scenebuilder/blob/master/kit/src/main/java/com/oracle/javafx/scenebuilder/kit/library/util/JarExplorer.java#L128探索 jar 中的所有类,并找到有效的类作为自定义控件:

  • 类名不以java., javax., javafx., com.oracle.javafx.scenebuilder., com.javafx., com.gluonhq.
  • 具体类(非抽象类)
  • 可分配自Node。这非常重要:该类应该是 JavaFX 节点的子类,就像一个容器(即从VBox)或内置节点(即从Button).

对于找到的所有类,将使用以下内容构建 FXML:

 <?import your.class.fullname?>
 <your.class.simplename />

如果该 FXML 可以由FXMLLoader,那么它就是一个自定义控件。 否则将被丢弃。

自定义控件类型

关于如何构建自定义控件有多种方法,但如果您要使用 FXML 这个旧的方法tutorial https://docs.oracle.com/javase/8/javafx/fxml-tutorial/custom_control.htm给出了一些关于如何使用的重要说明fx:root以及如何定义控制器,例如:

public class CustomControl extends VBox {

    public CustomControl() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(
"custom_control.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }
...
}

Java 11 级别

最后,由于 Scene Builder 11 在 Java 11 上运行,因此必须在编译时支持 Java 11。

使用 Maven:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
          <source>11</source>
          <target>11</target>
    </configuration>
</plugin>

在使用场景生成器之前,您可以在演示项目中尝试自定义控件。这将帮助您提前发现并解决可能出现的问题。

场景生成器 11

构建控件后,您可以打开场景生成器11 https://gluonhq.com/products/scene-builder/#download并按照以下命令导入它文档 https://docs.gluonhq.com/scenebuilder/#_library_manager.

基本上,使用该选项Add Library/FXML from file system并浏览您的文件系统以找到该 jar。

注意:有一个合并公关 https://github.com/gluonhq/scenebuilder/pull/228这将允许使用项目的 build/target 目录,而不需要 jar。

如果是发布的自定义控件,您应该得到:

如果视图没有显示您的控件,则您必须首先解决一个问题。

注:还有待处理PR https://github.com/gluonhq/scenebuilder/pull/234当进程失败时,这将提供更多信息。

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

在 Jar 中为 Gluon Scene Builder 11.00 创建自定义控件 的相关文章

  • 如何测试包含自定义表单控件的组件?

    我有一个这样的组件 Component selector app custom form control templateUrl
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 删除 JFX 中选项卡后面的灰色背景

    So is there any way to remove the gray area behind the tab s 我尝试过用 CSS 来做到这一点 但没有找到方法 要设置 tabpane 标题的背景颜色 请在 CSS 文件中写入 t
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 错误:缺少 JavaFX 运行时组件,并且需要使用 Gradle 示例来运行此应用程序

    我知道这个问题已被问过多次 但我似乎找不到解决方案 摘自官方指南示例 https openjfx io openjfx docs gradle https openjfx io openjfx docs gradle我继续添加了我的构建 g
  • 导出 .jar 时出现 FileNotFoundException

    在我的客户端 服务器应用程序中 我需要发送一些文件 txt doc等 从客户端到服务器 当我在 Eclipse 中运行代码时 它可以工作 但是当我导出 Applet 的签名 JAR 时 它不能工作 它抛出一个FileNotFoundExce
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • 如何将测试类打包到jar中而不运行它们?

    我正在努力将我的测试类包含到 jar 包中 但不运行它们 经过一番谷歌搜索后 我尝试过mvn package DskipTests 但我的测试类根本没有添加到 jar 中 有任何想法吗 如果您遵循 Maven 约定 那么您的测试类位于src
  • JavaFX ScrollPane 样式

    我正在尝试在 JavaFX 中创建一个黑白 ScrollPane 我已经创建了一个 CSS 文件 它工作得很好 除了这个小方块 无论我尝试什么 我都无法将其变黑 这是我的 CSS 文件 scroll pane fx background c
  • javafx组合框下拉菜单从屏幕边缘跳出

    我有最新版本的 java 8 40 和 javaFX 我有一个包含 10 个项目的复选框 我编译并运行该程序 如果我将程序窗口移至监视器屏幕的底部 下拉列表将从监视器屏幕中消失 无法将项目点击出屏幕 相反 如果我尝试使用场景生成器 2 0
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 使用notebook时将jar添加到pyspark

    我正在尝试将 mongodb hadoop 与 Spark 集成 但不知道如何使 IPython 笔记本可以访问这些 jar 这是我想做的 set up parameters for reading from MongoDB via Had
  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • 如何从表列javafx中删除行

    这些是我的表格列 Course and 描述 如果单击一行 该行变为 活动 突出显示 并且他们按下Delete按钮它应该删除该行 我该怎么做 我的代码Course列 以及我要添加什么事件侦听器到我的delete按钮 SuppressWarn
  • 为什么我的 Java 路径中添加了“L”?

    我在我的类路径中加载了一个 jar 在 iReport 中 如果重要的话 我确信它具有所需的方法 但是当我尝试测试连接 从而调用该 jar 时 我得到一个 java lang NoSuchMethodError 说它正在引用班上 Lorg
  • 如何在Linux终端中使用外部jar文件编译java项目

    我有一个项目 其中包含外部 jar 文件 我点击了此链接http www wikihow com Add JARs to Project Build Paths in Eclipse 28Java 29 http www wikihow c
  • 带有地图的 JavaFX TableView 对象

    因此 我对 JavaFx TableView 进行了一些挖掘 并找到了一些针对简单情况的不错的解决方案 This article http docs oracle com javafx 2 ui controls table view ht
  • 如何在谓词中对 FilteredList 结果进行优先级排序/排名?

    我的应用程序包含一个TextField and a ListView The TextField允许用户输入搜索词来过滤内容ListView当他们打字时 过滤过程将匹配每个字段中的多个字段DataItem in the ListView如果
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设

随机推荐

  • Python 2.7 布尔运算符逻辑

    我目前正在学习Python 2 7 并且遇到了相等和布尔运算符 我的问题是 Why False and 1 is False but True and 1 is 1 同样地 False or 1 is 1 but True or 1 is
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • Visual Studio 2013删除已删除的git分支

    我遇到这个问题 在 VS2013 中 当我从源创建一个新分支时 源分支的下拉列表列出了曾经创建的所有分支 这包括长期从本地存储库和远程 源存储库中删除的分支 如何删除已删除的分支 Visual Studio 将它们保存在本地缓存中 您可以从
  • 提供软件设置的最佳方式?

    我正在使用 C NET 在我的软件中 我提供设置对话框 用户可以通过该对话框设置我想要保存到文件的应用程序设置 要求 典型 我定义的每个类都使用这些设置的某些部分 因此 这些对于所有类都应该是全局的 这些应该在软件启动时加载 当用户更改设置
  • 在 python 的 Visual Studio 工具中按下 ctrl+F5 后,控制台窗口立即关闭

    我已经安装了 Visual Studio 的 Python 工具 但在控制台窗口中看不到输出 就像我在 Visual Studio 中运行 C 控制台应用程序时按以下快捷键时看到的输出一样 F5 开始调试程序并关闭 C 和 Python 中
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • 如何使用.net更改selenium中的用户代理

    我想使用不同的代理 iPhone iPad Android 测试用 NET 编写的 Web 应用程序 我使用 NUnit 和 Selenium 进行测试 有人有一个用 c 或 VB 在 Selenium 中更改代理 例如 iPad 或 iP
  • 如何使用 LeafLe 创建商店地图

    我希望创建一个可以交互的地图 我发现的最好的选择是传单 问题是我没有找到任何资源来解释如何创建自己的地图 我希望创建一个商场地图 用户可以在其中看到所有商店 喷泉 我怎样才能做到这一点 最好的起点是传单示例页面 http leafletjs
  • 如何从二叉搜索树中均匀随机地返回节点?

    给定一个 BST 可能平衡也可能不平衡 如何能够均匀地随机返回 任何 节点 一个限制是您不能使用外部索引数据结构 您必须以每个节点都有平等被访问的机会的方式遍历树 这个问题让我困惑了好一阵子 如果我们确实可以使用外部哈希表 指针 我们可以对
  • 禁用显示控制台窗口

    我可以在哪里禁用 Microsoft Visual C 显示控制台窗口 在您的控制台应用程序中 转到 Properties gt Linker gt System change SubSystem to Windows 并在你的代码中 代替
  • 如何在依赖注入之外构造对象?

    我有很多使用依赖注入来注入对象集合的服务 如下所示 IRepository
  • 子 git 存储库作为主存储库的子集

    我正在寻找一种方法来设置 git 存储库 其中包括来自较大存储库的文件子集 并从该主存储库继承历史记录 我的主要动机是能够通过 GitHub 共享代码子集 我目前通过单个 git 存储库管理我的研究相关 主要是 Matlab 代码 代码本身
  • 对象 std::cout 是如何构造/实例化的

    所以 std cout 是一个对象 我的疑问是它是如何 在哪里构建 实例化的 Thanks 它是由ios base Init 第一次创建该对象时 cout并创建了朋友 如果最后一个对象被破坏 cout朋友们脸红了 打电话 flush 在 C
  • 如何在 Javascript 中获取时区名称(PDT、EST 等)? [复制]

    这个问题在这里已经有答案了 使用 Javascript 有没有办法根据用户的设备获取用户的时区名称 PDT EST 等 我尝试过的代码 const timezone jstz determine const userTimezone tim
  • 如何在bash中仅提取两个字符串之间多行的第一个实例?

    我的文件是 abc 123 xyz abc 675 xyz 我想提取 abc 123 xyz 123 可以是任何东西 重点是我想要第一次出现 我尝试使用这个 sed n abc xyz p filename 但这给了我所有的例子 我怎样才能
  • sfinae 与 decltype:clang 或 gcc 中的错误?

    Clang 3 2 可以编译并且代码的行为符合预期 struct have f int f int i return 10 struct empty template
  • 在 React 中禁用 Material-UI 生产 css 类名

    我正在使用 Material UI for React 并且我想在以下情况下禁用它处理类名的方式 NODE ENV production 例如 开发 MuiAppBar root 12 制作 jss12 我希望生产类名称与开发中使用的类相同
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • List.Clear() 在 C# 中是如何实现的?

    我假设它使用数组来实现 List 怎么List Clear 实施的 它实际上清理了数组还是只是为此列表创建了一个新数组 public class List private Array array public void Clear1 arr
  • 在 Jar 中为 Gluon Scene Builder 11.00 创建自定义控件

    我想在可执行 jar 文件中创建自定义控件 然后在 Gluon Scene Builder 11 00 中使用 我需要知道如何做到这一点 我尝试了几种形式 但在场景生成器中导入 jar 时我的控件没有出现 我正在使用 IntelliJ Co