使用 FXML 在 JavaFX 中加载其 FXML 文件时,如何在第二个控制器上自动启动动作事件?

How to auto start an action event on a 2nd controller when loading its FXML file in JavaFX with FXML?

我有 2 个 FXML 文件和 2 个控制器。每个 FXML 文件都有自己的控制器。第一个场景有一个按钮,可将您带到第二个场景。现在我的问题是,如何开始执行命令 "label.setText ("Hello There \n");"在我的第二个控制器中,除了单击 scene1 的按钮将我带到 scene2 之外,没有执行任何其他 ActionEvent 。

主控制器:

public void startNewScene() throws IOException {
    root = FXMLLoader.load(getClass().getResource("FXML.fxml"));
    Scene scene = new Scene(root);
    Stage stage = new Stage();
    stage.setScene(scene);
    stage.show();
}

根据“ItachiUchiha”下面评论中的示例,第二个控制器

public class MyController implements Initializable {
    @FXML private Button button;
    @FXML private Label label;

    @FXML
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
               label.setText("hello there,  you clicked me"); 
            }
    }
);
    }
}

现在第二个场景已上传,但没有任何内容输出到屏幕或控制台。但是当我点击场景中的按钮时,一切正常。

所以我尝试设置 "onMouseClicked" 和 "onAction" 来初始化标签和按钮的 and/or 句柄,但我在 FXML 文件 [=13] 中收到错误 "handler method not found." =]

FXML 文件:

<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ciacv.MyController">
  <columnConstraints>
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
  </columnConstraints>
  <rowConstraints>
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
  </rowConstraints>
   <children>
      <Label fx:id="label"  />
      <Button fx:id="button" mnemonicParsing="false"  text="Button" GridPane.columnIndex="1" />
   </children>
</GridPane>

你的按钮在你的 fxml 中的 fx:idbutn1 在你的控制器中你试图注入带有声明

的按钮
@FXML private Button button;

您需要使用在 fxml 中声明的相同 fx:id 才能将对象正确注入其引用,即

@FXML private Button butn1;

编辑 - 根据评论

您需要设置 Scene on the Stage

public void startNewScene() throws IOException {
    root = FXMLLoader.load(getClass().getResource("FXML.fxml"));
    Scene scene = new Scene(root);
    Stage stage = new Stage();
    stage.setScene(scene);
    stage.show();
}

编辑 - 2

不,您没有编写任何内容来在加载 fxml 时设置标签中的文本。

您刚刚写了

label.setText("hello there,  you clicked me");` 

在按钮的操作中。如果需要在加载时设置label中的文字,可以在intialize()

里面写如下语句
@Override
public void initialize(URL location, ResourceBundle resources) {
    // Set Label's text intialize() is called
    label.setText("Helll There...");`
    // Set Label's text on Button's action
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
           label.setText("hello there,  you clicked me"); 
        }
    }
}