首页 > 解决方案 > 以编程方式设置 .fxml 文件

问题描述

我习惯于用 JavaFx 编写代码,如下所示,因为这是我几年前学习的方式。

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.stage.*;

public class test extends Application {
    int c=0;
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Demo");
        Button b = new Button("Click me");
        Label l = new Label("Count=" + c);
        VBox v = new VBox(20);
        v.getChildren().addAll(b, l);
        b.setOnAction(event -> {
            c++;
            l.setText("Count=" +c);
        });
        primaryStage.setScene(new Scene(v, 300, 300));
        primaryStage.show();
    }
}

我最近安装了 JetBrains IntelliJ IDEA Ultimate Edition 2018.1.6,我看到要打开 primaryStage 窗口,我需要一个 fxml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.GridPane?>
<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Main">
</GridPane>

而我必须这样做,

primaryStage.setScene(new Scene(FXMLLoader.load(getClass().getResource("sample.fxml")), 300, 300));

如果我运行第一个代码片段,则什么也没有显示。但是,如果我用 FXMLLoader.load(getClass().getResources("sample.fxml")) 替换 VBox v,则只会显示一个没有按钮和标签的窗口。有没有一种方法可以忽略 fxml 文件的使用?或者我可以使用标准的编码方式(第一个代码片段)让编译器为我将其更改为 fxml 格式吗?

那是因为我想在网格布局中有 100x100 个标签,而每个标签都是一个像素。因此,在代码中,很容易运行嵌套的 for 循环来使用二维数组初始化和寻址每个标签。但是在 fxml 中初始化 1000 个标签太冗长、累人且不合逻辑。

在 JetBrains IntelliJ IDEA 社区版 2017.0.2 中,我从来不需要做这样的事情。当我升级到 Ultimate Edition 2018.1.6 时,我收到了这些错误。

标签: javaintellij-ideajavafxfxml

解决方案


您绝对可以在没有 FXML 的情况下将 IntelliJ 与 JavaFX 一起使用。

问:有没有一种方法可以忽略 fxml 文件的使用?

答:考虑到您在创建新 JavaFX 项目时从 IntelliJ 获得的默认设置中引用的代码片段,是的,它们的默认设置使用.fxml但不需要使用它。您可以删除该sample.fxml文件并根据需要重写start

旁注:没有什么能阻止您在同一个项目中同时使用 fxml 和代码方法,在某些情况下使用 fxml 是更好的方法,而在其他一些情况下使用代码更好。

问:或者我可以使用标准的编码方式(第一个代码片段)让编译器为我将其更改为 fxml 格式吗?

答:没有办法将 Java 代码转换为fxml,但正如我已经说过的,使用哪一个由您决定,您甚至可以在同一个项目中同时使用它们。


推荐阅读