├── .gitignore
├── .idea
├── .gitignore
├── compiler.xml
├── encodings.xml
├── jarRepositories.xml
├── javafx-native.iml
├── misc.xml
├── vcs.xml
└── workspace.xml
├── LICENSE
├── README.md
├── img
└── javafx-demo-native.exe.png
├── pom.xml
└── src
└── main
├── java
├── javafx
│ └── demo
│ │ └── graalvm
│ │ ├── JavaFXApplication.java
│ │ ├── Main.java
│ │ └── gui
│ │ └── Controller.java
└── module-info.java
└── resources
├── META-INF
└── native-image
│ ├── jni-config.json
│ ├── predefined-classes-config.json
│ ├── proxy-config.json
│ ├── reflect-config.json
│ ├── resource-config.json
│ └── serialization-config.json
└── javafx
└── demo
└── graalvm
├── graalvm_rabbit_icon.png
├── grain.png
├── gui.css
├── icon.png
├── main-view.fxml
├── metaimage-main-01.png
└── metaimage-main-02.png
/.gitignore:
--------------------------------------------------------------------------------
1 | target/
2 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | # Editor-based HTTP Client requests
4 | /httpRequests/
5 | # Datasource local storage ignored files
6 | /dataSources/
7 | /dataSources.local.xml
8 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/javafx-native.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
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 |
86 |
87 |
88 |
89 |
90 |
91 | {
92 | "associatedIndex": 6
93 | }
94 |
95 |
96 |
97 |
98 |
99 |
100 | {
101 | "keyToString": {
102 | "RunOnceActivity.OpenProjectViewOnStart": "true",
103 | "RunOnceActivity.ShowReadmeOnStart": "true",
104 | "WebServerToolWindowFactoryState": "false",
105 | "git-widget-placeholder": "main",
106 | "last_opened_file_path": "C:/dev/projects/dragon",
107 | "node.js.detected.package.eslint": "true",
108 | "node.js.detected.package.tslint": "true",
109 | "node.js.selected.package.eslint": "(autodetect)",
110 | "node.js.selected.package.tslint": "(autodetect)",
111 | "nodejs_package_manager_path": "npm",
112 | "project.structure.last.edited": "Project",
113 | "project.structure.proportion": "0.0",
114 | "project.structure.side.proportion": "0.2",
115 | "settings.editor.selected.configurable": "reference.projectsettings.compiler.javacompiler",
116 | "vue.rearranger.settings.migration": "true"
117 | }
118 | }
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 | 1729262389170
145 |
146 |
147 | 1729262389170
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 | 1729520888966
156 |
157 |
158 |
159 | 1729520888966
160 |
161 |
162 |
163 | 1729521519659
164 |
165 |
166 |
167 | 1729521519659
168 |
169 |
170 |
171 | 1729521951513
172 |
173 |
174 |
175 | 1729521951513
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JavaFX Native Demo
2 |
3 | This is a demo of a JavaFX application generated as a native image (for Windows) thanks to GraalVM (JDK 23). It uses the Native image plugin for Maven (version 0.10.3).
4 |
5 | The JavaFX demo uses FXML for describing the GUI:
6 | 
7 |
8 | ## How to build?
9 |
10 | To build it, you need to first follow [installation instructions for Visual Studio Build Tools for Windows](https://medium.com/graalvm/using-graalvm-and-native-image-on-windows-10-9954dc071311).
11 |
12 | Then, you'll need to configure properly your Maven environment, either using `.idea/workspace.xml` if you're using Intellij IDEA or your shell if using Maven.
13 |
14 | Build using: `mvn verify`
15 |
16 | ## What is generated?
17 |
18 | Inside the `./target` folder, you'll find the jar file as well as the native image `javafx-demo-native.exe` and some dlls. To allow for deployment of this simple demo, you'll need at least: the exe file along `java.dll` and `jvm.dll` libraries. These will allow opening a browser to the registered GraalVM website URLs when clicking on the buttons.
19 |
20 | ## Final note
21 |
22 | If you wish to make disappear the console whenever you start the native image, you'll need to run the following command (given your environment is properly setup):
23 | ```shell
24 | editbin /SUBSYSTEM:WINDOWS target\javafx-demo-native.exe
25 | ```
26 |
--------------------------------------------------------------------------------
/img/javafx-demo-native.exe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loiclefevre/javafx-native/4873e4f68978491eda418b9d8e6f064ce7531a95/img/javafx-demo-native.exe.png
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | javafx.demo
8 | javafx-demo-native
9 | 1.0.0
10 | JavaFX Native Demo
11 | JavaFX demo application made native with GraalVM.
12 |
13 |
14 | UTF-8
15 | 5.8.1
16 | 22
17 | 0.0.8
18 | 3.8.1
19 | 23
20 | 23
21 | 23
22 | VERBOSE
23 | 0.10.3
24 | ${user.home}/.m2/repository
25 | win
26 | javafx-demo-native
27 |
28 |
29 |
30 |
31 |
32 | org.openjfx
33 | javafx-controls
34 | ${javafx.version}
35 |
36 |
37 | org.openjfx
38 | javafx-fxml
39 | ${javafx.version}
40 |
41 |
42 | org.openjfx
43 | javafx-swing
44 | ${javafx.version}
45 |
46 |
47 |
48 | org.controlsfx
49 | controlsfx
50 | 11.2.1
51 |
52 |
53 | com.dlsc.formsfx
54 | formsfx-core
55 | 11.6.0
56 |
57 |
58 | org.openjfx
59 | *
60 |
61 |
62 |
63 |
64 | org.kordamp.bootstrapfx
65 | bootstrapfx-core
66 | 0.4.0
67 |
68 |
69 | org.fxmisc.flowless
70 | flowless
71 | 0.7.3
72 |
73 |
74 | org.fxmisc.wellbehaved
75 | wellbehavedfx
76 | 0.3.3
77 |
78 |
79 | org.fxmisc.undo
80 | undofx
81 | 2.1.1
82 |
83 |
84 |
85 |
86 |
87 | native
88 |
89 |
90 |
91 | org.graalvm.buildtools
92 | native-maven-plugin
93 | ${native.maven.plugin.version}
94 |
95 |
96 | build-native
97 |
98 | compile-no-fork
99 |
100 | package
101 |
102 |
103 | test-native
104 |
105 | test
106 |
107 | test
108 |
109 |
110 |
111 | true
112 | false
113 | ${imageName}
114 | false
115 |
116 | false
117 |
118 |
119 | --module-path target/${imageName}-1.0.0.jar
120 | -Ob
121 | -march=native
122 | --initialize-at-build-time=javafx.demo.graalvm/javafx.demo.graalvm.Main
123 | --add-modules javafx.demo.graalvm
124 | --add-modules javafx.base,javafx.graphics,javafx.fxml,javafx.controls,javafx.swing
125 |
126 | --module javafx.demo.graalvm/javafx.demo.graalvm.Main
127 |
128 | --module-path ${local.repository}/org/openjfx/javafx-base/22/javafx-base-22-${target.os}.jar
129 | --module-path ${local.repository}/org/openjfx/javafx-graphics/22/javafx-graphics-22-${target.os}.jar
130 | --module-path ${local.repository}/org/openjfx/javafx-controls/22/javafx-controls-22-${target.os}.jar
131 | --module-path ${local.repository}/org/openjfx/javafx-fxml/22/javafx-fxml-22-${target.os}.jar
132 | --module-path ${local.repository}/org/openjfx/javafx-swing/22/javafx-swing-22-${target.os}.jar
133 |
134 | --module-path ${local.repository}/org/controlsfx/controlsfx/11.2.1/controlsfx-11.2.1.jar
135 | --module-path ${local.repository}/com/dlsc/formsfx/formsfx-core/11.6.0/formsfx-core-11.6.0.jar
136 | --module-path ${local.repository}/org/kordamp/bootstrapfx/bootstrapfx-core/0.4.0/bootstrapfx-core-0.4.0.jar
137 | --module-path ${local.repository}/org/fxmisc/flowless/flowless/0.7.3/flowless-0.7.3.jar
138 | --module-path ${local.repository}/org/fxmisc/wellbehaved/wellbehavedfx/0.3.3/wellbehavedfx-0.3.3.jar
139 | --module-path ${local.repository}/org/fxmisc/undo/undofx/2.1.1/undofx-2.1.1.jar
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 | org.apache.maven.plugins
152 | maven-compiler-plugin
153 | 3.13.0
154 |
155 | ${maven.compiler.source}
156 | ${maven.compiler.source}
157 |
158 |
159 |
160 |
161 | org.apache.maven.plugins
162 | maven-jar-plugin
163 | 3.4.2
164 |
165 |
166 |
167 |
168 |
169 |
170 | llefevre
171 | Loïc Lefèvre
172 | Oracle
173 | https://www.oracle.com
174 |
175 | product manager
176 |
177 |
178 |
179 |
180 |
--------------------------------------------------------------------------------
/src/main/java/javafx/demo/graalvm/JavaFXApplication.java:
--------------------------------------------------------------------------------
1 | package javafx.demo.graalvm;
2 |
3 | import javafx.demo.graalvm.gui.Controller;
4 | import javafx.application.Application;
5 | import javafx.fxml.FXMLLoader;
6 | import javafx.scene.Parent;
7 | import javafx.scene.Scene;
8 | import javafx.scene.SceneAntialiasing;
9 | import javafx.scene.image.Image;
10 | import javafx.stage.Stage;
11 |
12 | import java.util.Objects;
13 |
14 | /**
15 | * the JavaFX application.
16 | *
17 | * @author Loïc Lefèvre
18 | */
19 | public class JavaFXApplication extends Application {
20 |
21 | static Controller guiController;
22 |
23 | public JavaFXApplication() {
24 | super();
25 | }
26 |
27 | @Override
28 | public void start(Stage stage) throws Exception {
29 | final FXMLLoader fxmlLoader = new FXMLLoader(JavaFXApplication.class.getResource("main-view.fxml"));
30 | final Parent parent = fxmlLoader.load();
31 | final Scene scene = new Scene(parent, -1f, -1f, false, SceneAntialiasing.BALANCED);
32 | stage.setResizable(false);
33 | stage.setScene(scene);
34 | stage.setTitle("JavaFX native image with GraalVM!");
35 | stage.getIcons().add(new Image(Objects.requireNonNull(JavaFXApplication.class.getResourceAsStream("icon.png"))));
36 |
37 | guiController = fxmlLoader.getController();
38 | guiController.initialize();
39 | stage.show();
40 | }
41 | }
--------------------------------------------------------------------------------
/src/main/java/javafx/demo/graalvm/Main.java:
--------------------------------------------------------------------------------
1 | package javafx.demo.graalvm;
2 |
3 | import javafx.application.Application;
4 |
5 | import java.util.Locale;
6 |
7 | /**
8 | * Application main entry point.
9 | *
10 | * @author Loïc Lefèvre
11 | *
12 | */
13 | public class Main {
14 | public static void main(final String[] args) {
15 | // Better looking
16 | System.setProperty("prism.lcdtext", "false");
17 |
18 | // Standardize dates and numbers formatting
19 | Locale.setDefault(Locale.US);
20 |
21 | // Launch the JavaFX app
22 | Application.launch(JavaFXApplication.class, args);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/javafx/demo/graalvm/gui/Controller.java:
--------------------------------------------------------------------------------
1 | package javafx.demo.graalvm.gui;
2 |
3 | import javafx.fxml.FXML;
4 |
5 | import java.awt.*;
6 | import java.io.IOException;
7 | import java.net.URI;
8 | import java.net.URISyntaxException;
9 |
10 | /**
11 | * GUI controller for widgets.
12 | *
13 | * @author Loïc Lefèvre
14 | */
15 | public class Controller {
16 | private boolean needsInitialization = true;
17 |
18 | public void initialize() {
19 | if (needsInitialization) {
20 | needsInitialization = false;
21 | }
22 | }
23 |
24 | @FXML
25 | private void openLinkDownload() {
26 | try {
27 | Desktop.getDesktop().browse(new URI("https://www.graalvm.org/downloads/"));
28 | }
29 | catch (IOException | URISyntaxException e) {
30 | e.printStackTrace();
31 | }
32 | }
33 | @FXML
34 | private void openLinkGetStarted() {
35 | try {
36 | Desktop.getDesktop().browse(new URI("https://www.graalvm.org/latest/docs/getting-started/"));
37 | }
38 | catch (IOException | URISyntaxException e) {
39 | e.printStackTrace();
40 | }
41 | }
42 | }
--------------------------------------------------------------------------------
/src/main/java/module-info.java:
--------------------------------------------------------------------------------
1 | module javafx.demo.graalvm {
2 | requires javafx.base;
3 | requires javafx.controls;
4 | requires javafx.fxml;
5 | requires javafx.swing;
6 | requires javafx.graphics;
7 | requires org.controlsfx.controls;
8 | requires com.dlsc.formsfx;
9 | requires org.kordamp.bootstrapfx.core;
10 | requires java.desktop;
11 |
12 | opens javafx.demo.graalvm to javafx.fxml, java.desktop;
13 | exports javafx.demo.graalvm;
14 |
15 | opens javafx.demo.graalvm.gui to javafx.fxml;
16 | exports javafx.demo.graalvm.gui;
17 | }
--------------------------------------------------------------------------------
/src/main/resources/META-INF/native-image/jni-config.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name":"[Lcom.sun.glass.ui.Screen;"
4 | },
5 | {
6 | "name":"sun.awt.shell.ShellFolderManager",
7 | "allDeclaredFields":true,
8 | "allDeclaredMethods":true,
9 | "allDeclaredConstructors":true
10 | },
11 | {
12 | "name":"com.sun.glass.ui.Application",
13 | "methods":[{"name":"notifyPreferencesChanged","parameterTypes":["java.util.Map"] }, {"name":"reportException","parameterTypes":["java.lang.Throwable"] }]
14 | },
15 | {
16 | "name":"com.sun.glass.ui.Clipboard",
17 | "fields":[{"name":"name"}],
18 | "methods":[{"name":"actionPerformed","parameterTypes":["int"] }, {"name":"contentChanged","parameterTypes":[] }]
19 | },
20 | {
21 | "name":"com.sun.glass.ui.Cursor",
22 | "methods":[{"name":"getNativeCursor","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
23 | },
24 | {
25 | "name":"com.sun.glass.ui.Pixels",
26 | "methods":[{"name":"attachData","parameterTypes":["long"] }]
27 | },
28 | {
29 | "name":"com.sun.glass.ui.Screen",
30 | "methods":[{"name":"","parameterTypes":["long","int","int","int","int","int","int","int","int","int","int","int","int","int","int","int","float","float","float","float"] }]
31 | },
32 | {
33 | "name":"com.sun.glass.ui.Size",
34 | "methods":[{"name":"","parameterTypes":["int","int"] }]
35 | },
36 | {
37 | "name":"com.sun.glass.ui.View",
38 | "fields":[{"name":"ptr"}],
39 | "methods":[{"name":"getAccessible","parameterTypes":[] }, {"name":"getHeight","parameterTypes":[] }, {"name":"getWidth","parameterTypes":[] }, {"name":"notifyDragDrop","parameterTypes":["int","int","int","int","int"] }, {"name":"notifyDragEnter","parameterTypes":["int","int","int","int","int"] }, {"name":"notifyDragLeave","parameterTypes":[] }, {"name":"notifyDragOver","parameterTypes":["int","int","int","int","int"] }, {"name":"notifyInputMethod","parameterTypes":["java.lang.String","int[]","int[]","byte[]","int","int","int"] }, {"name":"notifyInputMethodCandidatePosRequest","parameterTypes":["int"] }, {"name":"notifyKey","parameterTypes":["int","int","char[]","int"] }, {"name":"notifyMenu","parameterTypes":["int","int","int","int","boolean"] }, {"name":"notifyMouse","parameterTypes":["int","int","int","int","int","int","int","boolean","boolean"] }, {"name":"notifyRepaint","parameterTypes":["int","int","int","int"] }, {"name":"notifyScroll","parameterTypes":["int","int","int","int","double","double","int","int","int","int","int","double","double"] }, {"name":"notifyView","parameterTypes":["int"] }]
40 | },
41 | {
42 | "name":"com.sun.glass.ui.Window",
43 | "methods":[{"name":"notifyClose","parameterTypes":[] }, {"name":"notifyDelegatePtr","parameterTypes":["long"] }, {"name":"notifyDestroy","parameterTypes":[] }, {"name":"notifyFocus","parameterTypes":["int"] }, {"name":"notifyFocusDisabled","parameterTypes":[] }, {"name":"notifyFocusUngrab","parameterTypes":[] }, {"name":"notifyMove","parameterTypes":["int","int"] }, {"name":"notifyMoveToAnotherScreen","parameterTypes":["com.sun.glass.ui.Screen"] }, {"name":"notifyScaleChanged","parameterTypes":["float","float","float","float"] }]
44 | },
45 | {
46 | "name":"com.sun.glass.ui.win.WinApplication"
47 | },
48 | {
49 | "name":"com.sun.glass.ui.win.WinDnDClipboard",
50 | "methods":[{"name":"getInstance","parameterTypes":[] }, {"name":"setDragButton","parameterTypes":["int"] }]
51 | },
52 | {
53 | "name":"com.sun.glass.ui.win.WinGestureSupport",
54 | "methods":[{"name":"gesturePerformed","parameterTypes":["com.sun.glass.ui.View","int","boolean","boolean","int","int","int","int","float","float","float","float","float","float","float"] }, {"name":"inertiaGestureFinished","parameterTypes":["com.sun.glass.ui.View"] }, {"name":"notifyBeginTouchEvent","parameterTypes":["com.sun.glass.ui.View","int","boolean","int"] }, {"name":"notifyEndTouchEvent","parameterTypes":["com.sun.glass.ui.View"] }, {"name":"notifyNextTouchEvent","parameterTypes":["com.sun.glass.ui.View","int","long","int","int","int","int"] }]
55 | },
56 | {
57 | "name":"com.sun.glass.ui.win.WinPixels"
58 | },
59 | {
60 | "name":"com.sun.glass.ui.win.WinSystemClipboard",
61 | "fields":[{"name":"ptr"}],
62 | "methods":[{"name":"fosSerialize","parameterTypes":["java.lang.String","long"] }]
63 | },
64 | {
65 | "name":"com.sun.glass.ui.win.WinView",
66 | "methods":[{"name":"notifyResize","parameterTypes":["int","int"] }]
67 | },
68 | {
69 | "name":"com.sun.glass.ui.win.WinWindow",
70 | "methods":[{"name":"notifyMoving","parameterTypes":["int","int","int","int","float","float","int","int","int","int","int","int","int"] }, {"name":"notifyResize","parameterTypes":["int","int","int"] }]
71 | },
72 | {
73 | "name":"com.sun.javafx.font.directwrite.D2D1_COLOR_F",
74 | "fields":[{"name":"a"}, {"name":"b"}, {"name":"g"}, {"name":"r"}],
75 | "methods":[{"name":"","parameterTypes":[] }]
76 | },
77 | {
78 | "name":"com.sun.javafx.font.directwrite.D2D1_MATRIX_3X2_F",
79 | "fields":[{"name":"_11"}, {"name":"_12"}, {"name":"_21"}, {"name":"_22"}, {"name":"_31"}, {"name":"_32"}],
80 | "methods":[{"name":"","parameterTypes":[] }]
81 | },
82 | {
83 | "name":"com.sun.javafx.font.directwrite.D2D1_PIXEL_FORMAT",
84 | "fields":[{"name":"alphaMode"}, {"name":"format"}],
85 | "methods":[{"name":"","parameterTypes":[] }]
86 | },
87 | {
88 | "name":"com.sun.javafx.font.directwrite.D2D1_POINT_2F",
89 | "fields":[{"name":"x"}, {"name":"y"}],
90 | "methods":[{"name":"","parameterTypes":[] }]
91 | },
92 | {
93 | "name":"com.sun.javafx.font.directwrite.D2D1_RENDER_TARGET_PROPERTIES",
94 | "fields":[{"name":"dpiX"}, {"name":"dpiY"}, {"name":"minLevel"}, {"name":"pixelFormat"}, {"name":"type"}, {"name":"usage"}],
95 | "methods":[{"name":"","parameterTypes":[] }]
96 | },
97 | {
98 | "name":"com.sun.javafx.font.directwrite.DWRITE_GLYPH_METRICS",
99 | "fields":[{"name":"advanceHeight"}, {"name":"advanceWidth"}, {"name":"bottomSideBearing"}, {"name":"leftSideBearing"}, {"name":"rightSideBearing"}, {"name":"topSideBearing"}, {"name":"verticalOriginY"}],
100 | "methods":[{"name":"","parameterTypes":[] }]
101 | },
102 | {
103 | "name":"com.sun.javafx.font.directwrite.DWRITE_GLYPH_RUN",
104 | "fields":[{"name":"advanceOffset"}, {"name":"ascenderOffset"}, {"name":"bidiLevel"}, {"name":"fontEmSize"}, {"name":"fontFace"}, {"name":"glyphAdvances"}, {"name":"glyphIndices"}, {"name":"isSideways"}],
105 | "methods":[{"name":"","parameterTypes":[] }]
106 | },
107 | {
108 | "name":"com.sun.javafx.font.directwrite.DWRITE_MATRIX",
109 | "fields":[{"name":"dx"}, {"name":"dy"}, {"name":"m11"}, {"name":"m12"}, {"name":"m21"}, {"name":"m22"}],
110 | "methods":[{"name":"","parameterTypes":[] }]
111 | },
112 | {
113 | "name":"com.sun.javafx.font.directwrite.RECT",
114 | "fields":[{"name":"bottom"}, {"name":"left"}, {"name":"right"}, {"name":"top"}],
115 | "methods":[{"name":"","parameterTypes":[] }]
116 | },
117 | {
118 | "name":"com.sun.prism.impl.PrismSettings",
119 | "fields":[{"name":"disableD3D9Ex"}, {"name":"forceGPU"}, {"name":"isVsyncEnabled"}, {"name":"verbose"}]
120 | },
121 | {
122 | "name":"java.awt.AWTEvent",
123 | "fields":[{"name":"bdata"}, {"name":"consumed"}, {"name":"id"}]
124 | },
125 | {
126 | "name":"java.awt.Component",
127 | "fields":[{"name":"appContext"}, {"name":"background"}, {"name":"cursor"}, {"name":"enabled"}, {"name":"focusable"}, {"name":"foreground"}, {"name":"graphicsConfig"}, {"name":"height"}, {"name":"parent"}, {"name":"peer"}, {"name":"visible"}, {"name":"width"}, {"name":"x"}, {"name":"y"}],
128 | "methods":[{"name":"getFont_NoClientCode","parameterTypes":[] }, {"name":"getLocationOnScreen_NoTreeLock","parameterTypes":[] }, {"name":"getToolkitImpl","parameterTypes":[] }, {"name":"isEnabledImpl","parameterTypes":[] }]
129 | },
130 | {
131 | "name":"java.awt.Font",
132 | "fields":[{"name":"name"}, {"name":"pData"}, {"name":"size"}, {"name":"style"}],
133 | "methods":[{"name":"getFont","parameterTypes":["java.lang.String"] }, {"name":"getFontPeer","parameterTypes":[] }]
134 | },
135 | {
136 | "name":"java.awt.Insets",
137 | "fields":[{"name":"bottom"}, {"name":"left"}, {"name":"right"}, {"name":"top"}],
138 | "methods":[{"name":"","parameterTypes":["int","int","int","int"] }]
139 | },
140 | {
141 | "name":"java.awt.Toolkit",
142 | "methods":[{"name":"getDefaultToolkit","parameterTypes":[] }, {"name":"getFontMetrics","parameterTypes":["java.awt.Font"] }]
143 | },
144 | {
145 | "name":"java.awt.desktop.UserSessionEvent$Reason",
146 | "fields":[{"name":"CONSOLE"}, {"name":"LOCK"}, {"name":"REMOTE"}, {"name":"UNSPECIFIED"}]
147 | },
148 | {
149 | "name":"java.awt.event.InputEvent",
150 | "fields":[{"name":"modifiers"}],
151 | "methods":[{"name":"getButtonDownMasks","parameterTypes":[] }]
152 | },
153 | {
154 | "name":"java.awt.image.ColorModel",
155 | "fields":[{"name":"colorSpace"}, {"name":"colorSpaceType"}, {"name":"isAlphaPremultiplied"}, {"name":"is_sRGB"}, {"name":"nBits"}, {"name":"numComponents"}, {"name":"supportsAlpha"}, {"name":"transparency"}],
156 | "methods":[{"name":"getRGBdefault","parameterTypes":[] }]
157 | },
158 | {
159 | "name":"java.awt.image.IndexColorModel",
160 | "fields":[{"name":"allgrayopaque"}, {"name":"map_size"}, {"name":"rgb"}, {"name":"transparent_index"}]
161 | },
162 | {
163 | "name":"java.lang.Boolean",
164 | "fields":[{"name":"FALSE"}, {"name":"TRUE"}]
165 | },
166 | {
167 | "name":"java.lang.Class",
168 | "methods":[{"name":"forName","parameterTypes":["java.lang.String","boolean","java.lang.ClassLoader"] }]
169 | },
170 | {
171 | "name":"java.lang.InternalError",
172 | "methods":[{"name":"","parameterTypes":["java.lang.String"] }]
173 | },
174 | {
175 | "name":"java.lang.Object",
176 | "methods":[{"name":"equals","parameterTypes":["java.lang.Object"] }]
177 | },
178 | {
179 | "name":"java.lang.Runnable",
180 | "methods":[{"name":"run","parameterTypes":[] }]
181 | },
182 | {
183 | "name":"java.lang.String",
184 | "methods":[{"name":"toLowerCase","parameterTypes":["java.util.Locale"] }]
185 | },
186 | {
187 | "name":"java.util.ArrayList",
188 | "methods":[{"name":"","parameterTypes":["int"] }, {"name":"add","parameterTypes":["java.lang.Object"] }]
189 | },
190 | {
191 | "name":"java.util.Collections",
192 | "methods":[{"name":"unmodifiableMap","parameterTypes":["java.util.Map"] }]
193 | },
194 | {
195 | "name":"java.util.HashMap",
196 | "methods":[{"name":"","parameterTypes":[] }, {"name":"containsKey","parameterTypes":["java.lang.Object"] }, {"name":"put","parameterTypes":["java.lang.Object","java.lang.Object"] }]
197 | },
198 | {
199 | "name":"java.util.Map",
200 | "methods":[{"name":"put","parameterTypes":["java.lang.Object","java.lang.Object"] }]
201 | },
202 | {
203 | "name":"javafx.scene.paint.Color",
204 | "methods":[{"name":"rgb","parameterTypes":["int","int","int","double"] }]
205 | },
206 | {
207 | "name":"sun.awt.AWTAutoShutdown",
208 | "methods":[{"name":"notifyToolkitThreadBusy","parameterTypes":[] }, {"name":"notifyToolkitThreadFree","parameterTypes":[] }]
209 | },
210 | {
211 | "name":"sun.awt.SunToolkit",
212 | "methods":[{"name":"isTouchKeyboardAutoShowEnabled","parameterTypes":[] }]
213 | },
214 | {
215 | "name":"sun.awt.image.SunVolatileImage",
216 | "fields":[{"name":"volSurfaceManager"}]
217 | },
218 | {
219 | "name":"sun.awt.image.VolatileSurfaceManager",
220 | "fields":[{"name":"sdCurrent"}]
221 | },
222 | {
223 | "name":"sun.awt.windows.WComponentPeer",
224 | "fields":[{"name":"hwnd"}, {"name":"winGraphicsConfig"}],
225 | "methods":[{"name":"disposeLater","parameterTypes":[] }, {"name":"replaceSurfaceData","parameterTypes":[] }, {"name":"replaceSurfaceDataLater","parameterTypes":[] }]
226 | },
227 | {
228 | "name":"sun.awt.windows.WDesktopPeer",
229 | "methods":[{"name":"systemSleepCallback","parameterTypes":["boolean"] }, {"name":"userSessionCallback","parameterTypes":["boolean","java.awt.desktop.UserSessionEvent$Reason"] }]
230 | },
231 | {
232 | "name":"sun.awt.windows.WObjectPeer",
233 | "fields":[{"name":"createError"}, {"name":"destroyed"}, {"name":"pData"}, {"name":"target"}],
234 | "methods":[{"name":"getPeerForTarget","parameterTypes":["java.lang.Object"] }]
235 | },
236 | {
237 | "name":"sun.awt.windows.WToolkit",
238 | "methods":[{"name":"displayChanged","parameterTypes":[] }, {"name":"windowsSettingChange","parameterTypes":[] }]
239 | },
240 | {
241 | "name":"sun.instrument.InstrumentationImpl",
242 | "methods":[{"name":"","parameterTypes":["long","boolean","boolean","boolean"] }, {"name":"loadClassAndCallAgentmain","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"loadClassAndCallPremain","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"transform","parameterTypes":["java.lang.Module","java.lang.ClassLoader","java.lang.String","java.lang.Class","java.security.ProtectionDomain","byte[]","boolean"] }]
243 | },
244 | {
245 | "name":"sun.java2d.Disposer",
246 | "methods":[{"name":"addRecord","parameterTypes":["java.lang.Object","long","long"] }]
247 | },
248 | {
249 | "name":"sun.java2d.InvalidPipeException"
250 | },
251 | {
252 | "name":"sun.java2d.NullSurfaceData"
253 | },
254 | {
255 | "name":"sun.java2d.SurfaceData",
256 | "fields":[{"name":"pData"}, {"name":"valid"}]
257 | },
258 | {
259 | "name":"sun.java2d.pipe.Region",
260 | "fields":[{"name":"bands"}, {"name":"endIndex"}, {"name":"hix"}, {"name":"hiy"}, {"name":"lox"}, {"name":"loy"}]
261 | },
262 | {
263 | "name":"sun.java2d.pipe.RegionIterator",
264 | "fields":[{"name":"curIndex"}, {"name":"numXbands"}, {"name":"region"}]
265 | }
266 | ]
267 |
--------------------------------------------------------------------------------
/src/main/resources/META-INF/native-image/predefined-classes-config.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "type":"agent-extracted",
4 | "classes":[
5 | ]
6 | }
7 | ]
8 |
9 |
--------------------------------------------------------------------------------
/src/main/resources/META-INF/native-image/proxy-config.json:
--------------------------------------------------------------------------------
1 | [
2 | ]
3 |
--------------------------------------------------------------------------------
/src/main/resources/META-INF/native-image/reflect-config.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name":"com.intellij.rt.execution.application.AppMainV2$Agent",
4 | "methods":[{"name":"premain","parameterTypes":["java.lang.String","java.lang.instrument.Instrumentation"] }]
5 | },
6 | {
7 | "name":"javafx.demo.graalvm.JavaFXApplication",
8 | "methods":[{"name":"","parameterTypes":[] }]
9 | },
10 | {
11 | "name":"javafx.demo.graalvm.Main",
12 | "methods":[{"name":"","parameterTypes":[] }, {"name":"main","parameterTypes":["java.lang.String[]"] }]
13 | },
14 | {
15 | "name":"javafx.demo.graalvm.gui.Controller",
16 | "allDeclaredFields":true,
17 | "queryAllDeclaredMethods":true,
18 | "methods":[{"name":"","parameterTypes":[] }, {"name":"initialize","parameterTypes":[] }, {"name":"openLinkDownload","parameterTypes":[] }, {"name":"openLinkGetStarted","parameterTypes":[] }]
19 | },
20 | {
21 | "name":"sun.awt.shell.ShellFolderManager",
22 | "allDeclaredFields":true,
23 | "allDeclaredMethods":true,
24 | "allDeclaredConstructors":true
25 | },
26 | {
27 | "name":"com.sun.glass.ui.Screen"
28 | },
29 | {
30 | "name":"com.sun.glass.ui.win.WinDnDClipboard"
31 | },
32 | {
33 | "name":"com.sun.glass.ui.win.WinGestureSupport"
34 | },
35 | {
36 | "name":"com.sun.glass.ui.win.WinPlatformFactory",
37 | "methods":[{"name":"","parameterTypes":[] }]
38 | },
39 | {
40 | "name":"com.sun.javafx.font.directwrite.DWFactory",
41 | "methods":[{"name":"getFactory","parameterTypes":[] }]
42 | },
43 | {
44 | "name":"com.sun.javafx.logging.PrintLogger",
45 | "methods":[{"name":"createInstance","parameterTypes":[] }]
46 | },
47 | {
48 | "name":"com.sun.javafx.logging.jfr.JFRPulseLogger",
49 | "methods":[{"name":"createInstance","parameterTypes":[] }]
50 | },
51 | {
52 | "name":"com.sun.javafx.reflect.Trampoline",
53 | "methods":[{"name":"invoke","parameterTypes":["java.lang.reflect.Method","java.lang.Object","java.lang.Object[]"] }]
54 | },
55 | {
56 | "name":"com.sun.javafx.scene.control.skin.Utils",
57 | "methods":[{"name":"getResource","parameterTypes":["java.lang.String"] }]
58 | },
59 | {
60 | "name":"com.sun.javafx.tk.quantum.QuantumToolkit",
61 | "methods":[{"name":"","parameterTypes":[] }]
62 | },
63 | {
64 | "name":"com.sun.prism.GraphicsPipeline",
65 | "methods":[{"name":"getFontFactory","parameterTypes":[] }, {"name":"getPipeline","parameterTypes":[] }]
66 | },
67 | {
68 | "name":"com.sun.prism.d3d.D3DPipeline",
69 | "methods":[{"name":"getInstance","parameterTypes":[] }]
70 | },
71 | {
72 | "name":"com.sun.prism.shader.FillPgram_Color_Loader",
73 | "allDeclaredFields":true,
74 | "allPublicFields":true,
75 | "allDeclaredMethods":true,
76 | "allPublicMethods":true,
77 | "allDeclaredConstructors":true,
78 | "allPublicConstructors":true,
79 | "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
80 | },
81 | {
82 | "name":"com.sun.prism.shader.FillPgram_ImagePattern_Loader",
83 | "allDeclaredFields":true,
84 | "allPublicFields":true,
85 | "allDeclaredMethods":true,
86 | "allPublicMethods":true,
87 | "allDeclaredConstructors":true,
88 | "allPublicConstructors":true,
89 | "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
90 | },
91 | {
92 | "name":"com.sun.prism.shader.FillPgram_LinearGradient_PAD_Loader",
93 | "allDeclaredFields":true,
94 | "allPublicFields":true,
95 | "allDeclaredMethods":true,
96 | "allPublicMethods":true,
97 | "allDeclaredConstructors":true,
98 | "allPublicConstructors":true,
99 | "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
100 | },
101 | {
102 | "name":"com.sun.prism.shader.FillRoundRect_Color_Loader",
103 | "allDeclaredFields":true,
104 | "allPublicFields":true,
105 | "allDeclaredMethods":true,
106 | "allPublicMethods":true,
107 | "allDeclaredConstructors":true,
108 | "allPublicConstructors":true,
109 | "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
110 | },
111 | {
112 | "name":"com.sun.prism.shader.Mask_TextureSuper_Loader",
113 | "allDeclaredFields":true,
114 | "allPublicFields":true,
115 | "allDeclaredMethods":true,
116 | "allPublicMethods":true,
117 | "allDeclaredConstructors":true,
118 | "allPublicConstructors":true
119 | },
120 | {
121 | "name":"com.sun.prism.shader.Solid_TextureRGB_Loader",
122 | "allDeclaredFields":true,
123 | "allPublicFields":true,
124 | "allDeclaredMethods":true,
125 | "allPublicMethods":true,
126 | "allDeclaredConstructors":true,
127 | "allPublicConstructors":true,
128 | "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
129 | },
130 | {
131 | "name":"com.sun.prism.shader.Texture_Color_Loader",
132 | "allDeclaredFields":true,
133 | "allPublicFields":true,
134 | "allDeclaredMethods":true,
135 | "allPublicMethods":true,
136 | "allDeclaredConstructors":true,
137 | "allPublicConstructors":true,
138 | "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
139 | },
140 | {
141 | "name":"com.sun.prism.shader.Texture_LinearGradient_PAD_Loader",
142 | "allDeclaredFields":true,
143 | "allPublicFields":true,
144 | "allDeclaredMethods":true,
145 | "allPublicMethods":true,
146 | "allDeclaredConstructors":true,
147 | "allPublicConstructors":true
148 | },
149 | {
150 | "name":"com.sun.scenario.effect.impl.hw.d3d.D3DShaderSource",
151 | "methods":[{"name":"","parameterTypes":[] }]
152 | },
153 | {
154 | "name":"com.sun.scenario.effect.impl.prism.PrRenderer",
155 | "methods":[{"name":"createRenderer","parameterTypes":["com.sun.scenario.effect.FilterContext"] }]
156 | },
157 | {
158 | "name":"com.sun.scenario.effect.impl.prism.ps.PPSBlend_SCREENPeer",
159 | "methods":[{"name":"","parameterTypes":["com.sun.scenario.effect.FilterContext","com.sun.scenario.effect.impl.Renderer","java.lang.String"] }]
160 | },
161 | {
162 | "name":"com.sun.scenario.effect.impl.prism.ps.PPSLinearConvolveShadowPeer",
163 | "methods":[{"name":"","parameterTypes":["com.sun.scenario.effect.FilterContext","com.sun.scenario.effect.impl.Renderer","java.lang.String"] }]
164 | },
165 | {
166 | "name":"com.sun.scenario.effect.impl.prism.ps.PPSRenderer",
167 | "methods":[{"name":"createRenderer","parameterTypes":["com.sun.scenario.effect.FilterContext"] }]
168 | },
169 | {
170 | "name":"com.sun.xml.internal.stream.XMLInputFactoryImpl",
171 | "methods":[{"name":"","parameterTypes":[] }]
172 | },
173 | {
174 | "name":"java.lang.Character",
175 | "methods":[{"name":"isIdeographic","parameterTypes":["int"] }]
176 | },
177 | {
178 | "name":"java.lang.Class",
179 | "methods":[{"name":"forName","parameterTypes":["java.lang.Module","java.lang.String"] }, {"name":"getModule","parameterTypes":[] }]
180 | },
181 | {
182 | "name":"java.lang.Module",
183 | "methods":[{"name":"getDescriptor","parameterTypes":[] }, {"name":"getLayer","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"getResourceAsStream","parameterTypes":["java.lang.String"] }]
184 | },
185 | {
186 | "name":"java.lang.ModuleLayer",
187 | "methods":[{"name":"boot","parameterTypes":[] }, {"name":"findModule","parameterTypes":["java.lang.String"] }]
188 | },
189 | {
190 | "name":"java.nio.ByteBuffer",
191 | "methods":[{"name":"order","parameterTypes":["java.nio.ByteOrder"] }]
192 | },
193 | {
194 | "name":"java.nio.ByteOrder",
195 | "methods":[{"name":"nativeOrder","parameterTypes":[] }]
196 | },
197 | {
198 | "name":"java.util.concurrent.atomic.AtomicBoolean",
199 | "fields":[{"name":"value"}]
200 | },
201 | {
202 | "name":"java.util.concurrent.atomic.AtomicReference",
203 | "fields":[{"name":"value"}]
204 | },
205 | {
206 | "name":"javafx.fxml.FXMLLoader"
207 | },
208 | {
209 | "name":"javafx.geometry.BorderPane"
210 | },
211 | {
212 | "name":"javafx.geometry.BoxBlur"
213 | },
214 | {
215 | "name":"javafx.geometry.Button"
216 | },
217 | {
218 | "name":"javafx.geometry.Canvas"
219 | },
220 | {
221 | "name":"javafx.geometry.DropShadow"
222 | },
223 | {
224 | "name":"javafx.geometry.Image"
225 | },
226 | {
227 | "name":"javafx.geometry.ImageView"
228 | },
229 | {
230 | "name":"javafx.geometry.Insets",
231 | "queryAllPublicMethods":true,
232 | "queryAllPublicConstructors":true,
233 | "methods":[{"name":"","parameterTypes":["double","double","double","double"] }]
234 | },
235 | {
236 | "name":"javafx.geometry.Label"
237 | },
238 | {
239 | "name":"javafx.geometry.Pane"
240 | },
241 | {
242 | "name":"javafx.geometry.Pos",
243 | "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
244 | },
245 | {
246 | "name":"javafx.geometry.VBox"
247 | },
248 | {
249 | "name":"javafx.scene.Camera"
250 | },
251 | {
252 | "name":"javafx.scene.Node",
253 | "queryAllDeclaredMethods":true,
254 | "methods":[{"name":"getId","parameterTypes":[] }, {"name":"getStyleClass","parameterTypes":[] }, {"name":"setBlendMode","parameterTypes":["javafx.scene.effect.BlendMode"] }, {"name":"setEffect","parameterTypes":["javafx.scene.effect.Effect"] }, {"name":"setId","parameterTypes":["java.lang.String"] }, {"name":"setLayoutX","parameterTypes":["double"] }, {"name":"setLayoutY","parameterTypes":["double"] }, {"name":"setPickOnBounds","parameterTypes":["boolean"] }]
255 | },
256 | {
257 | "name":"javafx.scene.ParallelCamera"
258 | },
259 | {
260 | "name":"javafx.scene.Parent",
261 | "queryAllDeclaredMethods":true,
262 | "methods":[{"name":"getStylesheets","parameterTypes":[] }]
263 | },
264 | {
265 | "name":"javafx.scene.Scene"
266 | },
267 | {
268 | "name":"javafx.scene.canvas.BorderPane"
269 | },
270 | {
271 | "name":"javafx.scene.canvas.BoxBlur"
272 | },
273 | {
274 | "name":"javafx.scene.canvas.Canvas",
275 | "queryAllDeclaredMethods":true,
276 | "queryAllPublicConstructors":true,
277 | "methods":[{"name":"","parameterTypes":[] }, {"name":"setHeight","parameterTypes":["double"] }, {"name":"setWidth","parameterTypes":["double"] }]
278 | },
279 | {
280 | "name":"javafx.scene.canvas.DropShadow"
281 | },
282 | {
283 | "name":"javafx.scene.canvas.Image"
284 | },
285 | {
286 | "name":"javafx.scene.canvas.ImageView"
287 | },
288 | {
289 | "name":"javafx.scene.canvas.Label"
290 | },
291 | {
292 | "name":"javafx.scene.canvas.Pane"
293 | },
294 | {
295 | "name":"javafx.scene.canvas.VBox"
296 | },
297 | {
298 | "name":"javafx.scene.control.BorderPane"
299 | },
300 | {
301 | "name":"javafx.scene.control.BoxBlur"
302 | },
303 | {
304 | "name":"javafx.scene.control.Button",
305 | "queryAllDeclaredMethods":true,
306 | "queryAllPublicConstructors":true,
307 | "methods":[{"name":"","parameterTypes":[] }]
308 | },
309 | {
310 | "name":"javafx.scene.control.ButtonBase",
311 | "queryAllDeclaredMethods":true,
312 | "methods":[{"name":"setOnAction","parameterTypes":["javafx.event.EventHandler"] }]
313 | },
314 | {
315 | "name":"javafx.scene.control.Control",
316 | "queryAllDeclaredMethods":true
317 | },
318 | {
319 | "name":"javafx.scene.control.DropShadow"
320 | },
321 | {
322 | "name":"javafx.scene.control.Image"
323 | },
324 | {
325 | "name":"javafx.scene.control.ImageView"
326 | },
327 | {
328 | "name":"javafx.scene.control.Label",
329 | "queryAllDeclaredMethods":true,
330 | "queryAllPublicConstructors":true,
331 | "methods":[{"name":"","parameterTypes":[] }]
332 | },
333 | {
334 | "name":"javafx.scene.control.Labeled",
335 | "queryAllDeclaredMethods":true,
336 | "methods":[{"name":"setMnemonicParsing","parameterTypes":["boolean"] }, {"name":"setText","parameterTypes":["java.lang.String"] }, {"name":"setTextAlignment","parameterTypes":["javafx.scene.text.TextAlignment"] }, {"name":"setTextFill","parameterTypes":["javafx.scene.paint.Paint"] }]
337 | },
338 | {
339 | "name":"javafx.scene.control.Pane"
340 | },
341 | {
342 | "name":"javafx.scene.control.VBox"
343 | },
344 | {
345 | "name":"javafx.scene.effect.BlendMode",
346 | "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
347 | },
348 | {
349 | "name":"javafx.scene.effect.BorderPane"
350 | },
351 | {
352 | "name":"javafx.scene.effect.BoxBlur",
353 | "queryAllDeclaredMethods":true,
354 | "queryAllPublicConstructors":true,
355 | "methods":[{"name":"","parameterTypes":[] }, {"name":"setHeight","parameterTypes":["double"] }, {"name":"setWidth","parameterTypes":["double"] }]
356 | },
357 | {
358 | "name":"javafx.scene.effect.DropShadow",
359 | "queryAllDeclaredMethods":true,
360 | "queryAllPublicConstructors":true,
361 | "methods":[{"name":"","parameterTypes":[] }, {"name":"setHeight","parameterTypes":["double"] }, {"name":"setOffsetY","parameterTypes":["double"] }, {"name":"setRadius","parameterTypes":["double"] }, {"name":"setWidth","parameterTypes":["double"] }]
362 | },
363 | {
364 | "name":"javafx.scene.effect.Effect",
365 | "queryAllDeclaredMethods":true
366 | },
367 | {
368 | "name":"javafx.scene.effect.Image"
369 | },
370 | {
371 | "name":"javafx.scene.effect.ImageView"
372 | },
373 | {
374 | "name":"javafx.scene.effect.Pane"
375 | },
376 | {
377 | "name":"javafx.scene.effect.VBox"
378 | },
379 | {
380 | "name":"javafx.scene.image.BorderPane"
381 | },
382 | {
383 | "name":"javafx.scene.image.Image"
384 | },
385 | {
386 | "name":"javafx.scene.image.ImageView",
387 | "queryAllDeclaredMethods":true,
388 | "queryAllPublicConstructors":true,
389 | "methods":[{"name":"","parameterTypes":[] }, {"name":"setFitHeight","parameterTypes":["double"] }, {"name":"setFitWidth","parameterTypes":["double"] }, {"name":"setImage","parameterTypes":["javafx.scene.image.Image"] }, {"name":"setPreserveRatio","parameterTypes":["boolean"] }]
390 | },
391 | {
392 | "name":"javafx.scene.image.Pane"
393 | },
394 | {
395 | "name":"javafx.scene.image.VBox"
396 | },
397 | {
398 | "name":"javafx.scene.layout.BorderPane",
399 | "methods":[{"name":"getAlignment","parameterTypes":["javafx.scene.Node"] }, {"name":"getAlignment","parameterTypes":["javafx.scene.Parent"] }, {"name":"getAlignment","parameterTypes":["javafx.scene.layout.Pane"] }, {"name":"getAlignment","parameterTypes":["javafx.scene.layout.Region"] }, {"name":"isAlignment","parameterTypes":["javafx.scene.Parent"] }, {"name":"isAlignment","parameterTypes":["javafx.scene.layout.Pane"] }, {"name":"isAlignment","parameterTypes":["javafx.scene.layout.Region"] }, {"name":"setAlignment","parameterTypes":["java.lang.Object","java.lang.String"] }, {"name":"setAlignment","parameterTypes":["javafx.css.Styleable","java.lang.String"] }, {"name":"setAlignment","parameterTypes":["javafx.event.EventTarget","java.lang.String"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.Node","java.lang.String"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.Node","javafx.geometry.Pos"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.Parent","java.lang.String"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.Parent","javafx.geometry.Pos"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.layout.Pane","java.lang.String"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.layout.Pane","javafx.geometry.Pos"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.layout.Region","java.lang.String"] }, {"name":"setAlignment","parameterTypes":["javafx.scene.layout.Region","javafx.geometry.Pos"] }]
400 | },
401 | {
402 | "name":"javafx.scene.layout.Image"
403 | },
404 | {
405 | "name":"javafx.scene.layout.ImageView"
406 | },
407 | {
408 | "name":"javafx.scene.layout.Pane",
409 | "queryAllDeclaredMethods":true,
410 | "queryAllPublicConstructors":true,
411 | "methods":[{"name":"","parameterTypes":[] }, {"name":"getChildren","parameterTypes":[] }]
412 | },
413 | {
414 | "name":"javafx.scene.layout.Region",
415 | "queryAllDeclaredMethods":true,
416 | "methods":[{"name":"setMaxHeight","parameterTypes":["double"] }, {"name":"setMaxWidth","parameterTypes":["double"] }, {"name":"setMinHeight","parameterTypes":["double"] }, {"name":"setMinWidth","parameterTypes":["double"] }, {"name":"setPadding","parameterTypes":["javafx.geometry.Insets"] }, {"name":"setPrefHeight","parameterTypes":["double"] }, {"name":"setPrefWidth","parameterTypes":["double"] }, {"name":"setScaleShape","parameterTypes":["boolean"] }]
417 | },
418 | {
419 | "name":"javafx.scene.layout.VBox",
420 | "queryAllDeclaredMethods":true,
421 | "queryAllPublicConstructors":true,
422 | "methods":[{"name":"","parameterTypes":[] }]
423 | },
424 | {
425 | "name":"javafx.scene.paint.Paint",
426 | "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
427 | },
428 | {
429 | "name":"javafx.scene.shape.Rectangle"
430 | },
431 | {
432 | "name":"javafx.scene.shape.Shape"
433 | },
434 | {
435 | "name":"javafx.scene.text.Font"
436 | },
437 | {
438 | "name":"javafx.scene.text.Text"
439 | },
440 | {
441 | "name":"javafx.scene.text.TextAlignment",
442 | "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
443 | },
444 | {
445 | "name":"javafx.scene.transform.Transform"
446 | },
447 | {
448 | "name":"javafx.scene.web.WebView"
449 | },
450 | {
451 | "name":"javafx.stage.Stage"
452 | },
453 | {
454 | "name":"javafx.stage.Window"
455 | },
456 | {
457 | "name":"sun.java2d.marlin.DMarlinRenderingEngine",
458 | "methods":[{"name":"","parameterTypes":[] }]
459 | },
460 | {
461 | "name":"sun.misc.Unsafe",
462 | "fields":[{"name":"theUnsafe"}]
463 | },
464 | {
465 | "name":"sun.security.provider.MD5",
466 | "methods":[{"name":"","parameterTypes":[] }]
467 | }
468 | ]
469 |
--------------------------------------------------------------------------------
/src/main/resources/META-INF/native-image/serialization-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "types":[
3 | ],
4 | "lambdaCapturingTypes":[
5 | ],
6 | "proxies":[
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/resources/javafx/demo/graalvm/graalvm_rabbit_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loiclefevre/javafx-native/4873e4f68978491eda418b9d8e6f064ce7531a95/src/main/resources/javafx/demo/graalvm/graalvm_rabbit_icon.png
--------------------------------------------------------------------------------
/src/main/resources/javafx/demo/graalvm/grain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loiclefevre/javafx-native/4873e4f68978491eda418b9d8e6f064ce7531a95/src/main/resources/javafx/demo/graalvm/grain.png
--------------------------------------------------------------------------------
/src/main/resources/javafx/demo/graalvm/gui.css:
--------------------------------------------------------------------------------
1 | #title {
2 | -fx-font-family: "Oracle Sans", sans-serif;
3 | -fx-font-size: 48px;
4 | -fx-font-weight: 400;
5 | }
6 |
7 | #subtitle {
8 | -fx-font-family: "Oracle Sans", sans-serif;
9 | -fx-font-size: 24px;
10 | -fx-font-weight: 200;
11 | }
12 |
13 | #img {
14 | -fx-background-color: linear-gradient(from 0% 100% to 100% 69%, hsb(207, 62%, 37%) 0%, hsb(210, 37%, 14%) 100%);
15 | -fx-background-image: url("grain.png") repeat;
16 | padding: 80px 0px 0px 0px;
17 | }
18 |
19 | #download, #getstarted {
20 | -fx-font-family: "Oracle Sans", sans-serif;
21 | -fx-font-size: 18px;
22 | -fx-font-weight: 400;
23 | -fx-background-color: rgb(242, 145, 16);
24 | -fx-background-radius: 12;
25 | -fx-background-insets: 1;
26 | -fx-text-fill: #ffffff;
27 | }
28 |
29 | #download:hover, #getstarted:hover {
30 | -fx-background-color: rgb(221, 131, 12);
31 | transition: rgb(242, 145, 16) 0.3s ease;
32 | }
--------------------------------------------------------------------------------
/src/main/resources/javafx/demo/graalvm/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loiclefevre/javafx-native/4873e4f68978491eda418b9d8e6f064ce7531a95/src/main/resources/javafx/demo/graalvm/icon.png
--------------------------------------------------------------------------------
/src/main/resources/javafx/demo/graalvm/main-view.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
21 |
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 |
--------------------------------------------------------------------------------
/src/main/resources/javafx/demo/graalvm/metaimage-main-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loiclefevre/javafx-native/4873e4f68978491eda418b9d8e6f064ce7531a95/src/main/resources/javafx/demo/graalvm/metaimage-main-01.png
--------------------------------------------------------------------------------
/src/main/resources/javafx/demo/graalvm/metaimage-main-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loiclefevre/javafx-native/4873e4f68978491eda418b9d8e6f064ce7531a95/src/main/resources/javafx/demo/graalvm/metaimage-main-02.png
--------------------------------------------------------------------------------