2013-05-08 27 views
1

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

java.beans.Beans.isDesignTime() 

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

[更新]

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

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

回答

0

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

1

JavaFX控件没有这样的设计时间。

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

从邮件列表线程custom controls in SceneBuilder报价:

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

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

注意,对于能够加载包含定制元素 在SceneBuilder一个FXML,该自定义元素必须是“好乖”。

  1. 它必须不需要特殊的生成器工厂。
  2. 它必须有一个公共的空构造。
  3. 如果它使用一个FXMLLoader加载一些嵌套FXML文件,则该 FXMLLoader必须被配置为使用从该 定制组件装载 类加载器(参见https://forums.oracle.com/forums/thread.jspa?forumID=1385&threadID=2433150 对于后面这最后一个要求的复杂细节)

回答一些附加分:

我不想添加所需的库,而不是我想绕过触发,电子代码xception。

Custom and Unknown Element Types section of the SceneBuilder User Guide状态,如果你不提供通过定制控件使用的类路径中,FXML一般还在SceneBuilder加载。如果提供了库,SceneBuilder将提供额外的功能(场景生成器应该能够在“内容”面板和“层次”面板中呈现它们)。

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

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 
}