【问题标题】:Use controls from another form/controller in JavaFX 8在 JavaFX 8 中使用来自另一个表单/控制器的控件
【发布时间】:2016-04-19 20:27:15
【问题描述】:

我有一个 JavaFX 8 应用程序...

MainApp.java

    Parent root;
    root = FXMLLoader.load(getClass().getResource("/fxml/MainForm.fxml"));
    Scene scene = new Scene(root);        
    stage.setScene(scene);
    stage.show();

MainForm.fxmlfx:controller="MainController" 定义其控制器,并且控制器本身包含一个文本字段textFieldUsername

@FXML
protected TextField textFieldUsername;

然后,有第二个表单AuxForm.fxml 和另一个控制器fx:controller="AuxController"。第二种形式包含在MainForm.fxml 中,如下所示:

<content>
  <fx:include source="AuxForm.fxml" />
</content>

现在我需要获取textFieldUsername 的值。第二个控制器需要此值,但我不知道如何执行此操作。我的第一个想法是public class AuxController extends MainController 让所有控件都可用,但这不起作用。

【问题讨论】:

    标签: javafx javafx-8


    【解决方案1】:

    fx:id 添加到fx:include

    <content>
      <fx:include fx:id="auxForm" source="AuxForm.fxml" />
    </content>
    

    现在您可以将包含的 fxml 的控制器(“嵌套控制器”)注入“主控制器”。假设 AuxForm.fxmlfx:controller="AuxController" 你可以这样做:

    public class MainController {
    
        @FXML
        private AuxController auxFormController ;
    
    
        public void initialize() {
            // call any methods you need on auxFormController ...
    
            // ...
        }
    
        // ...
    }
    

    这里的规则是您将单词Controller 附加到fx:id 的值以形成“嵌套控制器”的字段名称。

    现在您可以在AuxController(例如public String getUsername() {...})中定义您需要的任何方法,并在需要时从主控制器调用它们。

    例如,如果您需要向AuxController 提供数据,您可以在此处提供一个属性,您可以从MainController 设置或绑定该属性:

    public class AuxController {
    
         private final StringProperty username ;
    
        public StringProperty usernameProperty() {
            return username ;
        }
    
        //...
    }
    

    那么在主控制器的initialize()方法中就可以了

    auxFormController.usernameProperty().bind(
        textFieldUsername.textProperty());
    

    现在username.get() 将在文本字段中为您提供文本。

    有关详细信息,请参阅FXML documentation

    【讨论】:

    • 感谢詹姆斯的发帖。但是我想我实际上不明白。在我的示例中,我想在AuxController 中定义的方法中使用textFieldUsername(在MainController 中定义)。据我得到你的答案,是相反的吗?
    • 你不应该在你的控制器之外暴露 UI 元素。您需要另一个控制器中的文本字段做什么?详细说明您要做什么,明天我回到电脑前会更新答案。
    • 我已将问题的一部分(最后一段)编辑为:“现在我需要获取 textFieldUsername 的值。第二个控制器需要此值...”
    • 完美,我刚刚遇到了一个类似的想法,现在它就像魅力一样。谢谢。
    猜你喜欢
    • 2013-01-08
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多