1

有没有一种方法可以检测 JavaFX2 中的设计时间,并且可以在 SceneBuilder 中使用?类似的东西:

java.beans.Beans.isDesignTime()

摇摆?我正在开发应该在 SceneBuilder 中显示的自定义控件。但是触发 ClassNotFoundException 中的一些代码。我不想添加所需的库,而是想绕过触发该异常的代码。

[更新]

我会告诉我要完成什么。我扩展了输入控件组件(文本字段、组合框等)并添加了 propertyName 属性。我还创建了一个表单扩展面板,它将扫描其中的输入控件并根据属性名称为它们分配值。该值取自设置为表单的 POJO。我使用 apache commons beanutls 将值分配给输入控件,因此我需要为 bean utils jar 提供类路径。

如果我自动激活该功能,我将无法在 SceneBuilder 中使用 Form。因为表单将检测其中的输入控件并进行分配,因此需要该库。我决定停用该功能,并为程序员提供一种激活它的方法。这不是我想要的,但我想我别无选择。

4

3 回答 3

1

JavaFX 控件没有设计时间。

相反,控制代码需要遵循本答案中概述的几个简单规则。

从 SceneBuilder中的邮件列表线程自定义控件中引用

在 SceneBuilder 1.0 中,尚无法将自定义控件添加到 SceneBuilder 的库面板。但是,可以加载包含自定义控件的 FXML。这在 SceneBuilder 的用户指南中有描述 - 请参阅那里的自定义类型元素部分:

http://docs.oracle.com/javafx/scenebuilder/1/user_guide/library-panel.htm

请注意,为了能够在 SceneBuilder 中加载包含自定义元素的 FXML,该自定义元素必须“表现良好”。

  1. 它必须不需要特殊的 Builder Factory。
  2. 它必须有一个公共的空构造函数。
  3. 如果它使用 FXMLLoader 加载某些嵌套的 FXML 文件,则必须将该 FXMLLoader 配置为使用从中加载自定义组件的 ClassLoader(请参阅https://forums.oracle.com/forums/thread.jspa?forumID=1385&threadID =2433150 了解最后一个要求背后的血腥细节)

回答一些额外的问题:

我不想添加所需的库,而是想绕过触发该异常的代码。

SceneBuilder 用户指南的自定义和未知元素类型部分指出,如果您不提供自定义控件使用的类的路径,fxml 通常仍会加载到 SceneBuilder 中。如果提供了库,则 SceneBuilder 将提供额外的功能(Scene Builder 应该能够在 Content 面板和 Hierarchy 面板中呈现它们)。

我的猜测是,通过使用 SceneBuilder 的最新 1.1+ 版本而不是产品的 1.0 版本,您将获得对自定义控件的最佳支持。

于 2013-05-09T00:44:32.643 回答
0

FXML 始终是设计时。如果您在 FXML 中设计您的控件,然后在它的控制器中进行所有逻辑和事件处理,那么您可以免费获得它。

于 2013-05-08T19:32:30.083 回答
0

你可以使用这个类:

public class SceneBuilderHelper
{
    public static boolean isSceneBuilder()
    {
        try
        {
            Class.forName("com.oracle.javafx.scenebuilder.app.SceneBuilderApp");
            return true;
        }
        catch (ClassNotFoundException e)
        {
        }

        return  false;
    }
}

在您的代码中,您可以这样做:

if (!SceneBuilderHelper.isSceneBuilder())
{
   // do things that should not be done in SceneBuilder
}
于 2015-11-27T14:14:37.637 回答