2014-04-01 22 views
3

我有以下想法:如何将ControlsFX(对话框)与FXML文件一起使用?

  • 我想用ControlsFX:漂亮的UI,对于对话的良好支持。
  • 我想使用FXML作为用户界面的源代码:场景生成器很好地工作,快速创建和更改。

现在我面临使用ControlsFX和由FXML文件创建的UI一起的问题。这里是源代码:

public class ConfigUI { 
private Dialog dlg; 

@FXML 
TextField urlRepository; 

protected Action showConfigDialog() throws IOException { 
    dlg = new Dialog(null, "Configuration Dialog for Check SVN"); 

    Node content = null; 
    content = FXMLLoader.load(getClass().getResource("check-dialog.fxml")); 

    dlg.setResizable(false); 
    dlg.setIconifiable(false); 
    dlg.setContent(content); 
    dlg.getActions().addAll(Dialog.Actions.OK, Dialog.Actions.CANCEL); 
    return dlg.show(); 
} 

相应FXML文件check-dialog.fxml如下:

<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="ConfigUI"> 
    <children> 
    <Label layoutX="29.0" layoutY="26.0" text="URL of Repository" /> 
    <Label layoutX="29.0" layoutY="76.0" text="Revision Interval" /> 
    <TextField fx:id="urlRepository" layoutY="23.0" prefWidth="200.0" AnchorPane.leftAnchor="170.0" AnchorPane.rightAnchor="10.0" /> 
    <Slider fx:id="revIntervalLow" layoutY="77.0" prefWidth="196.0" AnchorPane.leftAnchor="170.0" AnchorPane.rightAnchor="234.0" /> 
    ... 
    </children> 
</AnchorPane> 

当我现在开始通过下面的代码的对话框中,TextField urlRepository的@FXML不起作用:

public void configureActionTrigger(ActionEvent actionEvent) { 
     ConfigUI ui = new ConfigUI(); 
     Action result = ui.showConfigDialog(); 
     ... 
    } 

在调试器中,我看到属性urlRepository从不绑定。我在这里错过了什么?是否有必要拥有一个应用程序类和一个控制器类,并且应用程序类构建了UI,然后绑定控制器?

在互联网上有没有一个例子可以解释一个非平凡的例子中ControlsFX和FXML文件如何一起使用?

回答

2

我找到了Uluk Biy的一个工作解决方案。这是什么对我有效:

  1. 将方法showConfigDialog()移动到调用者。
  2. 获取对话框和UI实例的引用(以便稍后从中获取配置的值)并将该引用添加到该调用中。

这里是改变上面:

Controller 
    public void configureActionTrigger(ActionEvent actionEvent) { 
    Dialog dlg = new Dialog(null, "Configuration Dialog for Check SVN"); 
    Action result = this.showConfigDialog(dlg); 
    ... 
    } 

    protected Action showConfigDialog(Dialog dlg) throws IOException { 
    Node content = content = FXMLLoader.load(getClass().getResource("check-dialog.fxml")); 
    dlg.setResizable(false); 
    dlg.setIconifiable(false); 
    dlg.setContent(content); 
    dlg.getActions().addAll(Dialog.Actions.OK, Dialog.Actions.CANCEL); 

    return dlg.show(); 
} 

ConfigUI 
    @FXML 
    TextField urlRepository; 

没有改变是必要的check-dialog.fxm

现在TextField被正确绑定,并且当我在文本字段中输入内容时,该字段的值将按预期更改。

所以解决方案是将构建配置对话框的UI职责转移到另一个类,并让控制器只处理输入。

3

线

content = FXMLLoader.load(getClass().getResource("check-dialog.fxml")); 

将创建ConfigUI类的新实例,所以你当前实例的urlRepository仍然未初始化。相反尝试:

FXMLLoader loader = new FXMLLoader(); 
loader.setController(this); 
content = (Parent) loader.load(getClass().getResourceAsStream("check-dialog.fxml")); 
+0

不错,我会尽快回到我的电脑上工作。现在我明白了FXML,生成器和控制器的作用要好得多。是否有可用的权威资源? – mliebelt

+0

当我按照你的建议,我得到一个异常:'javafx.fxml.LoadException:已经指定的控制器值.'。但通过重建整体,我可以为我解决它。 – mliebelt

相关问题