以编程方式设置.fxml文件

时间:2018-07-27 11:18:44

标签: java intellij-idea javafx 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,则只显示一个没有Button和Label的窗口。 有没有一种方法可以忽略fxml文件的使用?还是可以使用标准的编码方式(第一个代码段),让编译器为我将其更改为fxml格式?

这是因为当每个Label为一个像素时,我希望在网格布局中具有100x100个Label。因此,在代码中,很容易运行嵌套的for循环以使用2-d数组初始化和寻址每个Label。但是在fxml中初始化1000个标签太冗长,费力且不合逻辑。

我从不需要在JetBrains IntelliJ IDEA社区版2017.0.2中执行这些操作。当我升级到Ultimate Edition 2018.1.6时,出现了这些错误。

1 个答案:

答案 0 :(得分:1)

您可以肯定将IntelliJ与JavaFX一起使用,而无需FXML。

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

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

附带说明:没有什么可以阻止您在同一项目中同时使用fxml和代码方法,在某些情况下,使用fxml是更好的方法,而在另一些情况下,最好使用代码。

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

A:无法将Java代码转换为fxml,但是正如我已经说过的那样,您可以决定使用哪个代码,甚至可以同时使用两者他们在同一项目中。