如何设置将JavaFX控件导入Scene Builder?

问题描述:

我有一个JavaFX控件,基本上是其他几个JavaFX控件的合并。如何设置将JavaFX控件导入Scene Builder?

我希望它可以导入.jar文件到场景生成器,以便它可以像任何其他控件一样使用。我能想到的最接近的比喻是,当你在C#中定制控件时,在几个项目中多次使用它。

当我尝试导入FXML文件时,它不起作用。该控件不被视为一个单独的实体,而是基本上只是它在FXML文件中串联的所有部分。

我需要怎样处理FXML文件或controller.java文件,以便场景生成器能够导入.jar,查看控件并允许导入并使用每个控件自定义控件作为单个实体?我查了几个地方,甚至在Stack Overflow之前询问了一次(尽管我得到的答案不是我正在查找的答案,并且从那时起没有收到任何答复),但是我没有看到任何答案接近处理我的问题。

我来最接近与该线路FXML文件来完成:

<?scenebuilder-classpath-element /path/to/something?> 

,但我不知道在/path/to/something

发生的事情,我知道我可以,在初始化,只需将控制权添加到场景中,但这是次优的,而我正在拼命试图避免的。

+0

你见过这个问题吗? http:// *。com/questions/19342259/how-to-create-multiple-javafx-controllers-with-different-fxml-files Rafael – 2014-09-05 17:58:22

+0

我明白他们在做什么,从观察代码,只要我能告诉唯一的我错过的是在FXML中声明控制器(现在我已经通过Scene Builder完成)。 我编译了.jar,并试图再次导入它。我什么也没得到。它打开了罐子,并没有给我任何进口。所以虽然这帮助我发现我没有宣布控制器,但它仍然无法帮助我解决我的问题。谢谢你。 – Will 2014-09-05 18:28:15

+0

然后,检查出来 http://*.com/questions/16673407/javafx-custom-control-textfield-not-working – 2014-09-05 19:05:03

我终于能够解决这个问题。经过多次试验和错误,并遵循here的示例代码,我发现我的问题是每个FXML控件组需要2个类。 一个是组的实际控制者,另一个是容纳控制器的对象。我遵循解锁示例中的代码,这对我来说是天赐之物。 基本上可以归结为两个文件:

的对象(继承根节点的类型,在我的情况):

public class <InsertObjectClassNameHere> extends <RootContainerTypeHere>{ 
} 

这之后您需要的控制器类。这是我最熟悉的事情,但我仍然在做错事。这是需要implement initializable

public class <InsertControllerClassNameHere> implements Initializable{ 

} 

所以对我来说Object类看起来是这样的:

public class DGCSDefiner extends GridPane { 
    private final DGCSDefinerController Controller; 
    public DGCSDefiner(){ 
     this.Controller = this.Load(); 
    } 

    private DGCSDefinerController Load(){ 
     final FXMLLoader loader = new FXMLLoader(); 
     loader.setRoot(this); 
     loader.setClassLoader(this.getClass().getClassLoader()); 
     loader.setLocation(this.getClass().getResource("DGCSDefiner.fxml")); 

     try{ 
      final Object root = loader.load(); 
      assert root == this; 
     } catch(IOException ex){ 
      throw new IllegalStateException(ex); 
     } 

     final DGCSDefinerController cntrlr = loader.getController(); 
     assert cntrlr != null; 
     return cntrlr; 
    } 

    /** 
    * Get the settings defined by the controller. 
    * @return controller defined settings. 
    */ 
    public ColorSettings getColorSettings(){ 
     return this.Controller.getColorSettings(); 
    } 

    /** 
    * Set the controllers color settings. 
    * @param CS Defined color settings. 
    */ 
    public void setColorSettings(ColorSettings CS){ 
     this.Controller.setColorSettings(CS); 
    } 
} 

,然后有实际控制类。

因此,对于一个直接的答案,

,你需要有一个类,将被载入你的控制器,你需要从你的控制器向下传递给类,它使用您将工作(或者,您可以简单地将控制器公开并直接访问它)。