JavaFX的目录结构, 项目创建和发布, 基于JDK11+JavaFX SDK17
JDK 和 JavaFX SDK
需要使用JDK11, 推荐使用 https://adoptium.net/releases.html
JDK11
JavaFX 11 不再是JDK的一部分, 需要单独安装, 或者直接通过Maven Dependency引入.
参考 https://stackoverflow.com/questions/52467561/intellij-cant-recognize-javafx-11-with-openjdk-11
Start Guide: https://openjfx.io/openjfx-docs/#introduction
JavaFX 11 is not part of the JDK anymore
You can get it in different flavors, either as an SDK or as regular dependencies (maven/gradle).
You will need to include it to the module path of your project, even if your project is not modular.
如果不使用Maven, 需要在 https://gluonhq.com/products/javafx/ 下载对应版本的sdk,
JDK9之后的模块化
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
不使用 Maven 创建 JavaFX 项目
IDEA 直接用菜单新建JavaFX项目, 但是这种只适合 JDK8
如何在IDEA下创建JavaFX项目的说明 https://openjfx.io/openjfx-docs/#IDE-Intellij
例子
https://www.cnblogs.com/antfin/p/10345016.html
使用 Maven 创建JavaFX项目
使用 Maven 创建 JavaFX 项目是较简单方便的一种方式, 不需要关心包依赖关系, 只需要手工初始化一个项目结构, 剩下的事都可以交给Maven处理.
1. 项目结构
项目结构如下, 其中resources目录下的资源文件, 可以放在 resources 根目录, 也可以放到resources/org/openjfx, 两者在App.java中的载入方式不同
├── javafx_test01 │ ├── pom.xml │ ├── src │ │ └── main │ │ ├── java │ │ │ ├── com │ │ │ │ └── rockbb │ │ │ │ ├── App.java │ │ │ │ ├── PrimaryController.java │ │ │ │ └── SecondaryController.java │ │ │ └── module-info.java │ │ └── resources │ │ └── com │ │ └── rockbb │ │ ├── primary.fxml │ │ ├── secondary.fxml │ │ └── styles.css └── settings.xml
2. pom.xml
指定JDK版本为11, javafx版本为17.0.1, javafx.maven.plugin使用最新的0.0.8
3. module-info.java
这里定义项目模块的可见度, 反射的可见度, 以及依赖的其他模块. 后面的opens ... to 和 exports 需要使用自己工程的包名
module hellofx {
requires javafx.controls;
requires javafx.fxml;
opens com.rockbb to javafx.fxml;
exports com.rockbb;
}
4. App.java
这是应用的入口. 下面的载入方式对应资源文件在根目录, 如果要按 package 放, 去掉其中的.getClassLoader()就可以了
package com.rockbb;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class App extends Application {
private static Scene scene;
@Override
public void start(Stage stage) throws IOException {
scene = new Scene(loadFXML("primary"));
scene.getStylesheets().add(getClass().getResource("styles.css").toExternalForm());
stage.setScene(scene);
stage.show();
}
static void setRoot(String fxml) throws IOException {
scene.setRoot(loadFXML(fxml));
}
private static Parent loadFXML(String fxml) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
return fxmlLoader.load();
}
public static void main(String[] args) {
launch();
}
}
5. PrimaryController.java
package com.rockbb;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class PrimaryController {
public Button primaryButton;
@FXML
private void switchToSecondary() throws IOException {
App.setRoot("secondary");
}
}
6. SecondaryController.java
package com.rockbb;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class SecondaryController {
public Button secondaryButton;
@FXML
private void switchToPrimary() throws IOException {
App.setRoot("primary");
}
}
7. primary.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>
8. secondary.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>
8. styles.css
.button {
-fx-text-fill: blue;
}
运行
IDEA中在App类上右键菜单, 点Run即可运行
打包发布
在JDK16之前, 可以使用jlink将项目打包为带目录结构的可执行文件, 在pom中修改javafx-maven-plugin的配置
...
...
执行打包
clean compile javafx:jlink -f pom.xml
压缩使用2时, 最终产生的lib/modules尺寸会明显小很多, 这个并不一定体现到zip包的大小上, 2产生的zip包可能比0更大
在JDK16之后, 可以使用jpackage.
参考
英文教程 http://tutorials.jenkov.com/javafx/index.html
打包为fatjar https://stackoverflow.com/questions/52653836/maven-shade-javafx-runtime-components-are-missing
jlink和jpackage打包 https://dev.to/cherrychain/javafx-jlink-and-jpackage-h9
————————————————
版权声明:本文为CSDN博主「IOsetting」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/michaelchain/article/details/120945039