从JavaFX中的另一个Controller访问字段

时间:2014-04-13 21:11:17

标签: java binding javafx controllers

我正在使用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"/>

现在当action(输入按钮)被触发时我想访问并更改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)

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

2 个答案:

答案 0 :(得分:4)

在&#34;嵌套&#34;中展示属性控制器StreamController和PlayController。这些控制器可以根据需要将属性绑定到它们定义的UI组件。

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

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

答案 1 :(得分:0)

你需要将你的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);