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 窗口,我需要一个 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 时,我收到了这些错误。
解决方案
您绝对可以在没有 FXML 的情况下将 IntelliJ 与 JavaFX 一起使用。
问:有没有一种方法可以忽略 fxml 文件的使用?
答:考虑到您在创建新 JavaFX 项目时从 IntelliJ 获得的默认设置中引用的代码片段,是的,它们的默认设置使用.fxml
但不需要使用它。您可以删除该sample.fxml
文件并根据需要重写start
。
旁注:没有什么能阻止您在同一个项目中同时使用 fxml 和代码方法,在某些情况下使用 fxml 是更好的方法,而在其他一些情况下使用代码更好。
问:或者我可以使用标准的编码方式(第一个代码片段)让编译器为我将其更改为 fxml 格式吗?
答:没有办法将 Java 代码转换为fxml
,但正如我已经说过的,使用哪一个由您决定,您甚至可以在同一个项目中同时使用它们。
推荐阅读
- java - 根据百分比分布从一组值生成随机值
- amazon-web-services - 使用负载均衡器进行 AWS 自动缩放
- sql - SQL展开查询
- c - 为什么不同类型的符号占用相同的长度?
- webpack - 设置 webpack 4.0 以使用带有 ExtractTextPlugin 的 Google Material Design SASS
- python-3.x - 使用 SQL Alchemy ORM 在 postgres 中出现序列/自动增量问题
- java - 如何在 Android 中创建 Socket 发送数据到服务器?
- postgresql - postgres 事件触发器和功能不起作用
- unix - 远程 tar 文件和从 solaris 到 windows 的传输
- ssis - 在 SSIS 派生列表达式中删除部分字符串