Java:JavaFX项目FXML文件应用实例

布局文件和逻辑文件分离

可以使用 Scene Builder进行编辑

IDEA中使用scene builder

项目结构

── src   
    ├── com
    │   └── company
    │       ├── Controller.java   # 控制器文件
    │       ├── Main.java         # 主文件
    │       └── sample.fxml       # 布局文件
    └── style
        └── main.css               # 样式文件

1、主文件入口文件 Main.java
引入布局文件 sample.fxml


package com.company;

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 {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
         // 此处引入布局文件
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

2、布局文件 sample.fxml
(1)绑定控制器类 com.company.Controller
(2)绑定控制器文件中的方法 com.company.Controller.clickButton
(3)引入样式文件 style/main.css

<?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 prefHeight="400.0" prefWidth="600.0" stylesheets="@../../style/main.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.company.Controller">
   <children>
      <Button layoutX="271.0" layoutY="165.0" mnemonicParsing="false" onAction="#clickButton" text="这是一个按钮" />
      <Label fx:id="label" layoutX="308.0" layoutY="126.0" />
   </children>
</AnchorPane>


3、Controller.java控制器文件

package com.company;

import javafx.scene.control.Label;

public class Controller {
    public Label label;

    public void clickButton(){
        label.setText("按钮被点击了");
        System.out.println("按钮被点击了");
    }
}

4、样式css 文件
src/style/main.css

.label{
    -fx-text-fill: red;
}

打包jar

IDEA 下操作

1、配置:
工具栏点击Project Structure -> Artifacts -> + ->
JAR -> From modules with dependencies 选中有main方法的类

2、打包:
Build -> Build artifacts

3、运行程序
文件夹 out/artifacts 中生成jar文件,双击即可打开
在装有jre 的 Mac和Windows 均可正常运行

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一份实现你需求的 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 文件和两个控制器类来实现你的需求。在第一个窗口中点击按钮可以打开第二个窗口,在第二个窗口中输入数据并点击按钮可以将数据传递回第一个窗口并显示在标签中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值