【问题标题】:Access fields from another Controller in JavaFX从 JavaFX 中的另一个控制器访问字段
【发布时间】:2014-05-27 17:29:18
【问题描述】:

我正在使用 JavaFX 编写小型应用程序,但遇到了一个问题。

我有 fxml 文件:

MainPane.fxml
Stream.fxml
Play.fxml

每个人都有自己的控制器:

MainPaneController.java
StreamController.java
PlayController.java

MainPane 中的位置是:

<GridPane fx:controller="model.MainController" fx:id="mainGrid"
    xmlns:fx="http://javafx.com/fxml" alignment="CENTER" gridLinesVisible="true">

    <children>
        <fx:include source="Stream.fxml"/>
    </children>

    <children>
        <fx:include source="Play.fxml"/>
    </children>
</GridPane>

Play.fxml 有这个字段:

<TextField fx:id="searchField" text="Search" onAction="#search"/>

现在,当触发操作(输入按钮)时,我想访问并更改 Stream.fxml 中的标签,如下所示:

public class PlayController implements Initializable {

    @FXML
    private TextField searchField;

    @FXML
    protected void search() {
        System.out.println("Search");
        String text = searchField.getText();
        //how to access Label in StreamController
    }
}

我想避免像这样绑定

MainPaneController <-> StreamController
MainController <-> PlayController

并访问如下字段:

mainController.getStreamController.changeLabel(text)

因为我希望有更好的方法来做到这一点。

【问题讨论】:

    标签: java binding javafx controllers


    【解决方案1】:

    在“嵌套”控制器 StreamController 和 PlayController 中公开属性。这些控制器可以根据需要将属性绑定到它们定义的 UI 组件。

    然后按照 FXML 简介的Nested Controllers 部分所述将嵌套控制器注入 MainController。

    更新:Here's a more similar example,其中交互控制器都包含在一个通用 FXML 中。

    【讨论】:

    • 据我了解,在您的示例中,您可以从根控制器(MainController 类)中的子控制器(PersonEditorController 类)访问字段。在我的情况下,情况有所不同,因为我希望从 Controller 访问与第二个 Controller 无关的字段(它们都是另一个 fxml 的子级 - 它们之间没有 fx:include)
    • 只需在两个“兄弟”控制器中公开属性并在“父”控制器中将它们绑定在一起。
    • 已更新,以防其他人遇到此问题并希望做类似的事情。
    • 我还有一个问题,也许你知道答案。现在我在 label.textProperty 和 textField.textProperty 之间有了绑定。当我在文本字段中输入内容时,标签同时发生变化。是否可以绑定这些值,以便仅在 textField 中调用 onAction(按 Enter)后更改标签?
    • 一般来说,当您有新问题时,请发布新问题。在这种情况下,请参阅this question
    【解决方案2】:

    您需要将您的 Fxmlloader 从控制器发送到其他控制器,我的意思是在 playController 中创建一个方法来从 StreamController 获取您的 fxmloader。

    public class PlayController implements Initializable {
    
    pulic StreamController stream;
    @FXML
    private TextField searchField;
    
    @FXML
    protected void search() {
        System.out.println("Search");
        String text = searchField.getText();
       //how to access Label in StreamControlle
        stream._yourLabeL ....
    
    }
    public StreamController StreamController(){
          return stream;
    } 
    public StreamController setStreamController(StreamController streamController){
          stream=streamController
    }
    

    在包含 fxml loader 的类中添加这一行

    StreamController streamcontroller=myStreamFxml.getController();
     new PlayController().setStreamController(streamController);
    

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 2016-05-30
      • 2016-02-29
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多