JavaFX如何从被调用的控制器设置调用控制器中标签的文本

JavaFX如何从被调用的控制器设置调用控制器中标签的文本,java,javafx-8,fxml,netbeans-8,Java,Javafx 8,Fxml,Netbeans 8,我是一个JavaFX(和Java)新手,也是一个StackOverflow新手,所以如果我弄错了,我会提前道歉 我正在尝试创建一个应用程序,它有一个主场景,可以加载几个不同的场景作为窗格。每个不同的场景都由主场景上的按钮加载(更像是选项卡式窗格) 我在主屏幕上有一个标签,用于显示错误消息。我希望场景在遇到错误时更新主场景的标签文本,但我很难知道如何做到这一点。我在谷歌上搜索并尝试了几十条建议,但都无济于事。有人能告诉我我做错了什么吗?非常感谢 我已经创建了一个测试应用程序,显示我正在尝试做什么。

我是一个JavaFX(和Java)新手,也是一个StackOverflow新手,所以如果我弄错了,我会提前道歉

我正在尝试创建一个应用程序,它有一个主场景,可以加载几个不同的场景作为窗格。每个不同的场景都由主场景上的按钮加载(更像是选项卡式窗格)

我在主屏幕上有一个标签,用于显示错误消息。我希望场景在遇到错误时更新主场景的标签文本,但我很难知道如何做到这一点。我在谷歌上搜索并尝试了几十条建议,但都无济于事。有人能告诉我我做错了什么吗?非常感谢

我已经创建了一个测试应用程序,显示我正在尝试做什么。我正在使用JavaSE8和NetBeans8.2

主应用程序:

public class TestApp extends Application {

@Override
public void start(Stage stage) throws Exception {

    Parent root = FXMLLoader.load(getClass().getResource("FXMLMain.fxml"));
    Scene scene = new Scene(root);

    stage.setScene(scene);

    stage.show();
}

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

}
FXMLMain.fxml

<AnchorPane fx:id="anchorMain" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testapp.FXMLMainController">
   <children>
      <AnchorPane fx:id="anchorView" prefHeight="400.0" prefWidth="400.0" />
      <Button fx:id="btnLoadView1" layoutX="476.0" layoutY="39.0" mnemonicParsing="false" onAction="#loadView1" text="Load view 1" />
      <Label fx:id="lblSystemMessage" layoutX="411.0" layoutY="145.0" text="label for system messages" />
   </children>
</AnchorPane>
FXMLView1.fxml

<AnchorPane id="AnchorPane" fx:id="anchorView1" prefHeight="400.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testapp.FXMLView1Controller">
   <children>
      <Label layoutX="64.0" layoutY="45.0" text="This is view 1" />
      <Button fx:id="btnView1SimulateError" layoutX="64.0" layoutY="122.0" mnemonicParsing="false" onAction="#view1SimulateError" text="Simulate error" />
   </children>
</AnchorPane>
当我运行应用程序并单击btnLoadView1,然后单击BTNViewSimulateError时,我从FXMLMainController中的setSystemMessage方法中获得以下输出:

simulating error from View 1
received text FRED
lblSystemMessage.getText() is FRED

但是主场景中的标签文本没有更新为“FRED”。我做错了什么?

据我所知,您想从FXMLView1Controller调用FXMLMainController
setSystemMessage()
函数。问题是,要做到这一点,您需要有一个主控制器的引用。所以,你需要提供一个

这是可能的解决办法之一。您可以从主控制器的
初始化
功能加载FXMLView1.fxml。因此,您可以获得控制器,在负载中分配。以下是一个例子:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLView1.fxml"));
    try {
        paneView1 = loader.load();
        FXMLView1Controller view1Controller = loader.getController();
    }
    catch (IOException e) {
         ...
    }
现在您有了View1控制器。你想做什么就做什么。我建议您向其添加一个mainController字段并执行以下操作

 view1Controller.mainController = this;
等你需要的时候

 mainController.setSystemMessage(message);

据我所知,您想从FXMLView1Controller调用FXMLMainController
setSystemMessage()
函数。问题是,要做到这一点,您需要有一个主控制器的引用。所以,你需要提供一个

这是可能的解决办法之一。您可以从主控制器的
初始化
功能加载FXMLView1.fxml。因此,您可以获得控制器,在负载中分配。以下是一个例子:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLView1.fxml"));
    try {
        paneView1 = loader.load();
        FXMLView1Controller view1Controller = loader.getController();
    }
    catch (IOException e) {
         ...
    }
现在您有了View1控制器。你想做什么就做什么。我建议您向其添加一个mainController字段并执行以下操作

 view1Controller.mainController = this;
等你需要的时候

 mainController.setSystemMessage(message);

非常感谢,这非常有效。除了这句话之外,我完全理解了:“view1Controller.mainController=this;”。那到底是怎么回事?当我添加它时,NetBeans在FXMLView1控制器代码中添加了“FXMLMainController;”。当我打印LN时,我可以看到它被设置为“testapp”。FXMLMainController@2a13b30e". 如何从FXMLMainController代码访问mainController变量?再次感谢!抱歉,刚才掉了一分钱-现在我有了对View1控制器的引用,我可以设置它的一个变量。将其设置为“this”后,View 1控制器现在有一个回到主控制器的引用。我现在明白了。可爱的解决方案。谢谢非常感谢,这非常有效。除了这句话之外,我完全理解了:“view1Controller.mainController=this;”。那到底是怎么回事?当我添加它时,NetBeans在FXMLView1控制器代码中添加了“FXMLMainController;”。当我打印LN时,我可以看到它被设置为“testapp”。FXMLMainController@2a13b30e". 如何从FXMLMainController代码访问mainController变量?再次感谢!抱歉,刚才掉了一分钱-现在我有了对View1控制器的引用,我可以设置它的一个变量。将其设置为“this”后,View 1控制器现在有一个回到主控制器的引用。我现在明白了。可爱的解决方案。谢谢