以编程方式设置 .fxml 文件

Setup .fxml file programmatically

我习惯像下面给出的那样用 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 window,我需要一个 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));

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

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

在 JetBrains IntelliJ IDEA Community Edition 2017.0.2 中我从来没有做过这样的事情。当我升级到 Ultimate Edition 2018.1.6 时,我遇到了这些错误。

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

问:有什么方法可以忽略 fxml 文件的使用吗?

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

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

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

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