使用 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:id
是 butn1
在你的控制器中你试图注入带有声明
的按钮
@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");
}
}
}
我有 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:id
是 butn1
在你的控制器中你试图注入带有声明
@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");
}
}
}