帮我写一个javafx代码,要求实现:用两个fxml文件,和两个控制器,有两个窗口,在第二个窗口的文本框中中输入数据,点击按钮,在第一个窗口的标签中出现在第二个窗口中输入的数据
时间: 2024-03-13 11:43:58 浏览: 144
好的,以下是一份实现你需求的 JavaFX 代码。
首先,我们需要两个 FXML 文件,分别是 `WindowOne.fxml` 和 `WindowTwo.fxml`。其中,`WindowOne.fxml` 包含一个标签和一个按钮,`WindowTwo.fxml` 包含一个标签、一个文本框和一个按钮。下面是两个 FXML 文件的代码:
WindowOne.fxml:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="root" prefHeight="100.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label layoutX="14.0" layoutY="14.0" text="从窗口二中传来的数据:" />
<Label fx:id="dataLabel" layoutX="174.0" layoutY="14.0" />
<Button layoutX="14.0" layoutY="47.0" mnemonicParsing="false" onAction="#openWindowTwo" text="打开窗口二" />
</children>
</AnchorPane>
```
WindowTwo.fxml:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="root" prefHeight="100.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label layoutX="14.0" layoutY="14.0" text="请输入数据:" />
<TextField fx:id="textField" layoutX="91.0" layoutY="11.0" />
<Button layoutX="14.0" layoutY="47.0" mnemonicParsing="false" onAction="#submitData" text="传递数据" />
</children>
</AnchorPane>
```
接下来,我们需要两个控制器类,分别是 `WindowOneController` 和 `WindowTwoController`。`WindowOneController` 控制器类负责处理第一个窗口中的按钮点击事件和显示从第二个窗口传来的数据,`WindowTwoController` 控制器类负责处理第二个窗口中的按钮点击事件并将数据传递回第一个窗口。下面是两个控制器类的代码:
WindowOneController.java:
```java
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import java.io.IOException;
public class WindowOneController {
@FXML
private Label dataLabel;
@FXML
private void openWindowTwo() throws IOException {
// 创建一个 FXMLLoader 实例
FXMLLoader loader = new FXMLLoader(getClass().getResource("WindowTwo.fxml"));
// 调用 load() 方法加载 FXML 文件
Parent root = loader.load();
// 创建一个 Stage 实例
Stage stage = new Stage();
stage.setTitle("窗口二");
// 创建一个新的 Scene 并将其设置为 stage 的场景
Scene scene = new Scene(root, 300, 100);
stage.setScene(scene);
// 获取 WindowTwoController 实例并将 WindowOneController 实例传递给它
WindowTwoController controller = loader.getController();
controller.setWindowOneController(this);
// 显示 stage
stage.show();
}
public void setData(String data) {
// 将从第二个窗口中传来的数据显示在 dataLabel 中
dataLabel.setText(data);
}
}
```
WindowTwoController.java:
```java
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
public class WindowTwoController {
private WindowOneController windowOneController;
@FXML
private TextField textField;
@FXML
private void submitData() {
// 获取文本框中的数据
String data = textField.getText();
// 将数据传递回第一个窗口
windowOneController.setData(data);
// 关闭第二个窗口
textField.getScene().getWindow().hide();
}
public void setWindowOneController(WindowOneController controller) {
// 将第一个窗口的控制器实例传递给 WindowTwoController 实例
windowOneController = controller;
}
}
```
最后,我们需要一个 `Main` 类来启动程序。`Main` 类加载 `WindowOne.fxml` 文件并显示第一个窗口。下面是 `Main` 类的代码:
Main.java:
```java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
// 创建一个 FXMLLoader 实例
FXMLLoader loader = new FXMLLoader(getClass().getResource("WindowOne.fxml"));
// 调用 load() 方法加载 FXML 文件
Parent root = loader.load();
// 设置场景
Scene scene = new Scene(root, 300, 100);
primaryStage.setScene(scene);
primaryStage.setTitle("窗口一");
// 显示窗口
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
```
这份代码创建了两个窗口,并使用了两个 FXML 文件和两个控制器类来实现你的需求。在第一个窗口中点击按钮可以打开第二个窗口,在第二个窗口中输入数据并点击按钮可以将数据传递回第一个窗口并显示在标签中。
阅读全文