有没有办法在JavaFX2中检测可在SceneBuilder中运行的设计时间?类似的东西:
java.beans.Beans.isDesignTime()
摇摆?我正在开发应该在SceneBuilder中显示的自定义控件。但是在触发ClassNotFoundException中的一些代码。我不想添加所需的库,而是想绕过触发该异常的代码。
[更新]
我会告诉我要完成的事情。我扩展了输入控件组件(textfield,combobox等)并添加了propertyName属性。我还创建了一个Form extends面板,它将扫描其中的输入控件并根据propertiesName为它们赋值。该值取自设置为表单的POJO。我使用apache commons beanutls将值赋给输入控件,因此我需要为bean utils jar提供类路径。
如果我自动激活该功能,我不能在SceneBuilder中使用Form。因为表单将检测其中的输入控件并进行分配,因此需要库。我决定停用该功能,并为程序员提供一种激活它的方法。这不是我想要的,但我想我别无选择。
答案 0 :(得分:1)
JavaFX控件没有设计时间。
相反,控制代码需要遵循本答案中概述的几个简单规则。
从邮件列表主题custom controls in SceneBuilder引用:
在SceneBuilder 1.0中,尚无法添加自定义控件 SceneBuilder的库面板。然而,可以加载 包含自定义控件的FXML。这在SceneBuilder中有描述 用户指南 - 请参阅有关自定义类型元素的部分:
http://docs.oracle.com/javafx/scenebuilder/1/user_guide/library-panel.htm
请注意,为了能够加载包含自定义元素的FXML 在SceneBuilder中,该自定义元素必须“表现良好”。
- 一定不需要特殊的生成器工厂。
- 它必须有一个公共空构造函数。
- 如果它使用FXMLLoader加载一些嵌套的FXML文件,那么 必须将FXMLLoader配置为使用ClassLoader 自定义组件已加载 (见https://forums.oracle.com/forums/thread.jspa?forumID=1385&threadID=2433150 对于最后一项要求背后的血腥细节)
醇>
回答其他一些问题:
我不想添加所需的库,而是想绕过触发该异常的代码。
Custom and Unknown Element Types section of the SceneBuilder User Guide表示如果您没有提供自定义控件使用的类的路径,则fxml通常仍会在SceneBuilder中加载。如果提供了库,则SceneBuilder将提供额外的功能(Scene Builder应该能够在“内容”面板和“层次”面板中呈现它们。)
我的猜测是,通过使用recent 1.1+ build of SceneBuilder而不是产品的1.0版本,您将获得对自定义控件的最佳支持。
答案 1 :(得分:0)
FXML始终是设计时间。如果您使用FXML设计控件,然后在其控制器中设置所有逻辑和事件处理,那么您可以免费获得。
答案 2 :(得分: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
}