以编程方式设置 .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
,但正如我已经说过的,由您决定选择哪一个使用,你甚至可以在同一个项目中使用它们。
我习惯像下面给出的那样用 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
,但正如我已经说过的,由您决定选择哪一个使用,你甚至可以在同一个项目中使用它们。