javaFx发展

javaFx发展

从 JDK 11 开始,Oracle 将从 JDK 中删除 JavaFX,但在 2022 年之前,Oracle 还会继续为 JDK 8 中的 JavaFX 提供商业支持。2011 年,JavaFX 成为 Open JDK 的一部分开源,这项技术的发展现在由 OpenFX (国内网站 )社区负责

当然如果是基于高版本的jdk开发, 推荐使用Liberica JDK-不仅包含了 JavaFX,还继续为 Windows 以及 Linux 提供 32 位构建, 下载Full version版本就可以无缝切换

学习javaFx常用布局控件可参考JavaFX Tutorial

为何使用javaFx

跨平台

JavaFX可在Windows、Mac OS X和Linux上运行,利用 JavaFX 能够非常轻松的搭建出在各个平台下体验基本一致的应用,甚至有人还将 JavaFX 移植到安卓上

学习成本低

  • 有 Java 基础的完全能够通过阅读项目源码以及少量借助搜索引擎来学会使用,由于本身是基于java开发的,所以可以支持各类java第三方库,包括集成Spring Boot来构建项目

  • 支持通过 fxml 和 css 来编写界面,有前端或者android开发经验者均可快速上手

web方向支持

  • 拥有一个 WebView 组件,可以通过js与原生java交互,实现丰富的功能

  • 可运行于服务器端,通过浏览器提供用户访问,可参考jpro

支持使用Spring Boot管理

  • 可充分使用Spring Boot各类支持库

javafx-test-with-javapackager

TestOpenJfx14

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
@SpringBootApplication
public class MyApplication extends Application {

private ConfigurableApplicationContext springContext;

@Override
public void init() {
springContext = SpringApplication.run(MyApplication.class);
}

@Override
public void start(Stage primaryStage) throws Exception {
//Parent root = FXMLLoader.load(getClass().getResource("/fxml/main.fxml"), null, null, springContext::getBean);
//或者
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/main.fxml"));
fxmlLoader.setControllerFactory(springContext::getBean);
Parent root = fxmlLoader.load();

primaryStage.setTitle("xxx");
primaryStage.setScene(new Scene(root, 800, 700));
primaryStage.show();
}

@Override
public void stop(){
springContext.close();
}

public static void main(String[] args) {
//为了能正常使用Desktop.getDesktop()相关方法
System.setProperty("java.awt.headless", Boolean.toString(false));
launch();
}

}

public abstract class BaseController implements Initializable {

protected final Logger logger = LoggerFactory.getLogger(getClass());

@Autowired
protected ApplicationContext springContext;

/**
* 获取Scene
* @param actionEvent
* @return
*/
public Scene getScene(ActionEvent actionEvent) {
return ((Node) actionEvent.getSource()).getScene();
}

/**
* 获取Stage
* @param actionEvent
* @return
*/
public Stage getStage(ActionEvent actionEvent) {
Scene scene = getScene(actionEvent);
return (Stage) scene.getWindow();
}

/**
* 获取Stage
* 注意如果是在initialize中获取的话需使用 Platform.runLater(() -> Stage stage = getStage(node);});
* @param node
* @return
*/
public Stage getStage(Node node) {
return (Stage) node.getScene().getWindow();
}

/**
* 打开页面
* @param actionEvent
* @param fxmlName
* @throws IOException
*/
public void openController(ActionEvent actionEvent, String fxmlName) throws IOException {
Scene scene = getScene(actionEvent);
Parent root = FXMLLoader.load(getClass().getResource(fxmlName), null, null, springContext::getBean);
scene.setRoot(root);
}
}


示例

支持自动更新

java8使用fxlauncher, java9+使用update4j

1
2
//bufferedImage转image java11+需引用javafx-swing
new ImageView(SwingFXUtils.toFXImage(bufferedImage, null))