本篇分为3部分:命令行,eclipse插件,不用插件
(一)命令行运行javafx程序
(1)jdk8环境变量,jdk11编译命令,jfx11
(2)项目目录结构,其中out目录是用jdk11编译后的结果
. ├── out │ ├── module-info.class │ └── zhc │ └── Main.class └── src ├── module-info.java └── zhc └── Main.java
module-info.java
module helo{ exports zhc; requires javafx.base; requires javafx.graphics; requires javafx.controls; }
Main.java
package zhc; import javafx.application.Application; import javafx.stage.Stage; class Main extends Application{ public static void main(String[] args){ launch(args); } public void start(Stage primaryStage) { primaryStage.show(); } }
(3)编译:/jdk11/bin/javac --module-path $FX_HOME --add-modules javafx.controls -d out src/module-info.java src/zhc/Main.java
(4)运行失败:/jdk11/bin/java --module-path $FX_HOME:out --add-modules javafx.controls -m helo/zhc.Main
(java:32606): GLib-GObject-CRITICAL **: 02:22:33.096: g_value_set_boxed: assertion 'G_VALUE_HOLDS_BOXED (value)' failed (java:32606): GLib-GObject-CRITICAL **: 02:22:33.222: g_value_set_boxed: assertion 'G_VALUE_HOLDS_BOXED (value)' failed Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) Caused by: java.lang.RuntimeException: Unable to construct Application instance: class zhc.Main at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java.lang.NoSuchMethodException: zhc.Main.<init>() at java.base/java.lang.Class.getConstructor0(Class.java:3349) at java.base/java.lang.Class.getConstructor(Class.java:2151) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:801) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:474) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:447) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:446) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277) ... 1 more
恳请高手指点小弟,为何出错?多谢!
(二)基于JDK8 eclipse4.7 jdk11 jfx11的GUI尝试
深度操作系统 20.2 (下载 deepin.org)
Eclipse IDE for Java Developers V4.7.3 (下载http://mirrors.ustc.edu.cn/eclipse/technology/epp/downloads/release/ )这个版本在jdk11环境变量下,启动会报错(....)使用eclipse的原因是,我可以只把eclipse断网而不影响本机其他上网( https://bbs.deepin.org/zh/post/217118 )
jdk8: 作为环境变量,只为正常启动eclipse4.7。如果JFX项目中使用,编译时报错 Exception in thread "main" java.lang.UnsupportedClassVersionError: javafx/application/Application has been compiled by a more recent version of the Java Runtime (class file version 54.0) 网上也有Oracle jdk8正常运行eclispe的说法,估计和jfxSDK版本有关,jfxSDK从jdk11开始从jdk分离出来,开源发布。我用的jdk8是阿里的,不包含jfx
jdk11 : Alibaba_Dragonwell_11.0.11.7_x64_linux.tar.gz (下载 ) 用于在项目中依赖,以免编译出现上述错误。
jfx sdk11:(下载 https://openjfx.cn/dl/ )用更新版本的sdk行吗? 我试了16,可以运行窗口程序。
eclipse插件:不用也行。这个作用是新建项目时,有一套jfx的模板代码。安装方法 https://www.yiibai.com/javafx/install-efxclipse-into-eclipse.html
不能用eclipse在线安装插件,就用插件官网下载,http://efxclipse.bestsolution.at/install.html#all-in-one
fxml文件可视化工具:独立的软件,不安装的话用代码编辑fxml文件。 (下载 官网65MB左右,https://gluonhq.com/products/scene-builder/ ),使用是在eclipse插件中关联一下路径,就可以右键fxml文件选择用可视化工具编辑了。安装这个工具时有一点报错,但是查看已经安装上了,故没在意错误:
(自动安装过程) xdg-desktop-menu: No writable system menu directory found. dpkg: 处理软件包 scenebuilder (--install)时出错: 已安装 scenebuilder 软件包 post-installation 脚本 子进程返回错误状态 3 在处理时有错误发生: scenebuilder zhang@zhang-PC:/my40$ sudo dpkg -L scenebuilder /. /opt /opt/scenebuilder
(1)先装jdk8,配置环境变量。
(2)启动eclipse4.7,选择workspace,新建工程,如果安装了插件,这里新建javafx工程
(3)给项目添加jdk11依赖。先在eclipse全局添加jdk11,菜单window -- preferences
然后右键项目名,configure build path
(4)添加jfx sdk11依赖,现在全局window -- preferences 搜索user 添加用户库
然后用添加jdk11的方法,添加上一步的用户库,倒数第二个是用户库
(5)插件自动生成的代码模板是:
public class Main extends Application { @Override public void start(Stage primaryStage) { try { BorderPane root = new BorderPane(); Scene scene = new Scene(root,400,400); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } }
ctrl+F11 运行程序,报错
原因是代码中没有java module相关代码,解决办法在这里:https://my.oschina.net/tridays/blog/2222909
(6)运行结果:
(三)基于jdk11 + eclipse4.11 + jfx11没装插件
jdk11作为环境变量,( 下载地址见开篇 )
eclipse4.11 ,( 下载地址见开篇 ) 因为eclipse4.7 + jdk8会无法启动,报错,有知道解决办法的高手欢迎指点在下!多谢!
没有安装插件
(1)安装jdk11为环境变量
(2)启动eclipse4.11,新建普通java工程
(3)添加jfx11依赖,方法见前文
(4)在src目录下,新建包,在包下新建一个java文件,
public class Main extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { try { BorderPane root = new BorderPane(); Scene scene = new Scene(root,200,200); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } }
(5)因为是jdk11环境变量,意味着eclipse编译时现在支持java9的语法java module,所以在src下new -- File,名字是固定不能变的module-info.java
module fx1 { exports com.test; requires javafx.base; requires javafx.controls; requires javafx.graphics; }
(6) 运行结果