Java教程

JavaFX(第一篇)使用eclipse

本文主要是介绍JavaFX(第一篇)使用eclipse,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

本篇分为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

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

然后右键项目名,configure build path

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

(4)添加jfx sdk11依赖,现在全局window -- preferences 搜索user 添加用户库

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

然后用添加jdk11的方法,添加上一步的用户库,倒数第二个是用户库

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

(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 运行程序,报错

缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序

原因是代码中没有java module相关代码,解决办法在这里:https://my.oschina.net/tridays/blog/2222909

(6)运行结果:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

(三)基于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) 运行结果

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

这篇关于JavaFX(第一篇)使用eclipse的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!