基于Idea开发第一个JavaFx程序
想基于Java开发一个图形界面,发现从JDK1.8开始已经支持最新的图形界面javaFx,于是创建第一个程序尝试一下。没想到第一步就有坑和难点。专门写成文章分享给大家。
创建项目
首先使用IDEA创建一个javaFX项目,点击新建项目,弹出如下窗口:

注意要选择JDK1.8版本,同时选择左边的JavaFx,选项。然后点击“Next”。

输入项目名称,点击Next,创建项目完成。
但此时如果需要Maven来管理项目,则可以选择项目,右击,然后选择“Add Framework Support…”。

然后公选弹出框中的Maven选项即可,项目便新增了pom.xml文件依赖。
采坑一:配置JDK
上面虽然选择了JDK版本为1.8,但未必IDEA的所有配置都是1.8,因此要在IDEA的Java compile中看一下编译是否为JDK1.8,不是需要进行修改。同时在“Project Setting”中也需要逐一检查版本的一致性。
采坑二:警告信息
此时直接启动项目,会提示如下警告信息:
objc[98716]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java (0x108e674c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x108ee14e0). One of the two will be used. Which one is undefined.
大概意思是一个类实现了两次,有其中一个被使用,不影响使用,只是提示信息。
采坑三:程序报错
执行Main类,直接抛出如下异常,直接蒙圈:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at sample.Main.start(Main.java:13)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception running application sample.Main
原因很简单,找不到对应的sample.fxml文件。也就是getClass().getResource(“sample.fxml”)这个方法的结果为空。因为使用了Maven,它会把java文件编译成的class文件默认放在一个名为target的文件夹中,而sample.fxml放到了Main类的上级目录,因此找不到对应的配置文件。
只需在pom.xml设置,将布局fxml文件放在target指定的位置即可。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.fxml</include>
<include>**/fxml/*.fxml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
再次执行程序,直接弹出一个Hello World窗口,第一个程序终于完美启动。


关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接