JavaFX。控制器之间的通信

JavaFX。控制器之间的通信,javafx,tabs,Javafx,Tabs,你好,我从JavaFX开始,我遇到了一些问题。 我想从两个不同的角度传达两种控制。我怎么做? 我正在使用选项卡,我有两个控制器,我想做类似的事情: Application.java: public class JavaFXApplication6 extends Application { @Override public void start(Stage primaryStage) { try { Parent root = FXMLLoader.loa

你好,我从JavaFX开始,我遇到了一些问题。 我想从两个不同的角度传达两种控制。我怎么做? 我正在使用选项卡,我有两个控制器,我想做类似的事情:

Application.java:

public class JavaFXApplication6 extends Application 
{

@Override
public void start(Stage primaryStage) 
{
    try 
    {
        Parent root = FXMLLoader.load(getClass().getResource(
                "/view/FXML_Main.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e){
        e.printStackTrace();
    }

    primaryStage.setTitle("Back-end GUI");
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) 
{
    launch(args);
}

}
FXML_Main.FXML:

FXML_Tab1.FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0"
     xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" 
     fx:controller="controller.FXML_Tab1Controller">
<children>
  <Label fx:id="Label1" layoutX="282.0" layoutY="108.0" text="Label" />
  <TextField fx:id="FextField1" layoutX="215.0" layoutY="146.0" />
  <Button fx:id="Button1" layoutX="269.0" layoutY="197.0" mnemonicParsing="false"
      onAction="#actionButton1" text="Button" />
</children>
</AnchorPane>
FXML_Tab2.FXML:

类似的视频:

向每个
标签添加
fx:id

    <tabs>
      <Tab text="Untitled Tab 1">
           <content>
              <fx:include source="FXML_Tab1.fxml" fx:id="tab1" />
           </content>
      </Tab>
      <Tab text="Untitled Tab 2">
           <content>
              <fx:include source="FXML_Tab2.fxml" fx:id="tab2" />
           </content>
      </Tab>
    </tabs>
变量命名在这里非常重要:字段必须命名为
xController
,其中
x
fx:include
fx:id
属性的值。有关详细信息,请参阅

现在,在主控制器的
initialize()
方法中,可以建立两个控制器之间的关系:

public class FXML_MainController  {

    @FXML
    private FXML_Tab1Controller tab1Controller ;
    @FXML
    private FXML_Tab2Controller tab2Controller ;

    public void initialize() {
        tab1Controller.tab2Controller = tab2Controller ;
        tab2Controller.tab1Controller = tab1Controller ;
    }
}

fx:id
添加到每个
标记:

    <tabs>
      <Tab text="Untitled Tab 1">
           <content>
              <fx:include source="FXML_Tab1.fxml" fx:id="tab1" />
           </content>
      </Tab>
      <Tab text="Untitled Tab 2">
           <content>
              <fx:include source="FXML_Tab2.fxml" fx:id="tab2" />
           </content>
      </Tab>
    </tabs>
变量命名在这里非常重要:字段必须命名为
xController
,其中
x
fx:include
fx:id
属性的值。有关详细信息,请参阅

现在,在主控制器的
initialize()
方法中,可以建立两个控制器之间的关系:

public class FXML_MainController  {

    @FXML
    private FXML_Tab1Controller tab1Controller ;
    @FXML
    private FXML_Tab2Controller tab2Controller ;

    public void initialize() {
        tab1Controller.tab2Controller = tab2Controller ;
        tab2Controller.tab1Controller = tab1Controller ;
    }
}

作为评论,我并不建议像这样共享控制器:您应该使用JavaFXObservable属性将数据封装在数据模型中,并在两个控制器之间共享数据模型。这在控制器之间提供了更好的解耦。作为评论,我并不建议像这样共享控制器:应该使用JavaFX observable属性将数据封装在数据模型中,并在两个控制器之间共享数据模型。这在控制器之间提供了更好的解耦。
public class FXML_Tab2Controller implements Initializable {

FXML_Tab1Controller tab1controller;
@FXML public Label Label2;
@FXML public TextField TextField2;
@FXML public Button Button2;
/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
} 

@FXML private void actionButton2(ActionEvent event){
        Label2.setText(tab1controller.TextField1.getText());
}

}
    <tabs>
      <Tab text="Untitled Tab 1">
           <content>
              <fx:include source="FXML_Tab1.fxml" fx:id="tab1" />
           </content>
      </Tab>
      <Tab text="Untitled Tab 2">
           <content>
              <fx:include source="FXML_Tab2.fxml" fx:id="tab2" />
           </content>
      </Tab>
    </tabs>
public class FXML_MainController  {

    @FXML
    private FXML_Tab1Controller tab1Controller ;
    @FXML
    private FXML_Tab2Controller tab2Controller ;

}
public class FXML_MainController  {

    @FXML
    private FXML_Tab1Controller tab1Controller ;
    @FXML
    private FXML_Tab2Controller tab2Controller ;

    public void initialize() {
        tab1Controller.tab2Controller = tab2Controller ;
        tab2Controller.tab1Controller = tab1Controller ;
    }
}