【问题标题】:Custom FXML component (w/ controller) doesn't appear in SceneBuilder's "Import jar" dialog自定义 FXML 组件(带控制器)未出现在 SceneBuilder 的“导入 jar”对话框中
【发布时间】:2016-04-05 14:36:11
【问题描述】:

我正在关注this 创建自定义组件并导入它。但是,当它在单击 jar 文件后进入 Import Dialog 时,它不会出现。当我注释掉教程用于构造函数的代码时,它再次出现。但是,我用来制作自定义组件的子组件都没有出现。为什么以及如何解决?

另外,我正在使用 VBox 而不是 AnchorPane(如教程中所见)来做我自己的事情。

教程中的构造函数代码:

public CommodityImageLabel() {
    FXMLLoader fxmlLoader = new FXMLLoader(
            getClass().getResource("/fxml/CommodityImageLabel.fxml"));

    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

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

}

我自己的示例构造函数的代码:

public While() {
    FXMLLoader fxmlLoader = new FXMLLoader(
            getClass().getResource("BlocksFXML/While.fxml"));


    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

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

Edit1:我尝试注释掉部分代码,当我注释掉try-catch部分时,它使组件出现在对话框中,但它仍然不显示子组件。

编辑 2:自定义组件基本上是一个 VBox,其中包含一个带有标签和文本字段的 Hbox。 Here 是它应该的样子与它在没有 try-catch 部分的情况下成功导入时最终的样子。

【问题讨论】:

  • 你能edit你的问题包括一个没有出现的代码示例吗?
  • @James_D 我不确定你的意思,因为 FXML 是完整的,但是当我将它导入到 SceneBuilder 时,组件并没有像预期的那样显示。我附上了图片,如果它们有帮助的话。
  • 也许我理解错了。你是说教程里的版本不行吗?我以为只有你自己的例子不起作用。您使用的是哪个 Scene Builder 版本?
  • 对不起,我自己的例子是不工作的。我最近在这台笔记本电脑上安装了 Scene Builder,所以我猜它是最新的。
  • 相同的产品,但 Gluon 在版本 2 之后从 Oracle 接管了开发。

标签: java javafx custom-controls fxml


【解决方案1】:

我使用这里的信息解决了这个问题:

http://www.cuchazinteractive.com/blog/custom-javafx-controls-and-scene-builder

总结一下:

  1. 创建一个 FXML 文件和一个扩展根节点的 Java 类(我给了它们相同的名称)
  2. 更改 FXML 文件以将 fx:root 作为基节点。 (没有这个就不行)
  3. 删除fx:controller 属性(没有这个将不起作用)
  4. 编译并将 jar 添加到场景构建器中

但是,我发现如果你的自定义控件依赖于其他库中的控件,即使在场景构建器中加载了其他库,它也会失败。

下面是一个最小的工作示例

FXML:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>


<fx:root id="AnchorPane" prefHeight="73.0" prefWidth="112.0" type="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111">
   <children>
      <Button layoutX="25.0" layoutY="28.0" mnemonicParsing="false" text="Button" />
   </children>
</fx:root>

Java:

package my.amazing.controls;

import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.AnchorPane;

public class TestControl extends AnchorPane {


    public TestControl() throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("TestControl.fxml"));
        loader.setRoot(this);
        loader.setController(this);
        loader.load();
    }

    @FXML
    public void initialize() {
    }
}

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2014-03-21
    相关资源
    最近更新 更多