JavaFX11入门

JavaFX11 入门

Java11及之后的版本中,JavaFX不再内置,需要另外引入。可以通过直接下载jar文件引入,也可以通过maven引入。创建项目需要下载JavaFX11的JDK和Jmods(用于模块化打包),下载地址为JavaFX - Gluon (gluonhq.com)。在页面中勾选Include older versions,然后在上方的筛选条件里选择适合的版本,这里选择JavaFX11,windows系统,64位版。然后点击下方的Download下载SDK和jmods文件,下载后分别解压,将解压后的javafx-sdk-11文件夹放在Java的安装目录下(如C:\Program Files\Java),将Jmods解压得到的文件复制到jdk下的jmods目录下(如C:\Program Files\Java\jdk-11.0.9\jmods)。注意不是将文件夹整体复制进去,而是将jmods文件夹中的.jmod文件复制进去。(这一步的复制并不是必须的,主要用于模块化打包时方便定制jre环境)

一、使用Java11及Maven构建JavaFX11程序(使用Eclipse)

在Eclipse中新建一个Maven项目,配置jdk版本为11,并引入JavaFX11的依赖

	<!--设置编码为UTF-8,并配置jdk版本为11.注意,如果在Maven的setting文件中配置了jdk版本,这里的配置不会生效 -->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>11</maven.compiler.source>
		<maven.compiler.target>11</maven.compiler.target>
	</properties>
	<!-- 引入JavaFX11 -->
	<dependencies>
		<dependency>
			<groupId>org.openjfx</groupId>
			<artifactId>javafx-controls</artifactId>
			<version>11</version>
		</dependency>
		<dependency>
			<groupId>org.openjfx</groupId>
			<artifactId>javafx-fxml</artifactId>
			<version>11</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
	</dependencies>	

新建一个主类,继承Application,编写界面

package com.scw;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Main extends Application{

	public static void main(String[] args) {
		launch(args);

	}

	@Override
	public void start(Stage stage) throws Exception {
		Text text = new Text("Hello JavaFX11");
		text.setFont(Font.font("微软雅黑", FontWeight.BOLD, 20));
		Button button = new Button("Button");
		
		HBox hbox = new HBox();
		hbox.setPrefSize(400,300);
		hbox.setAlignment(Pos.CENTER);
		hbox.getChildren().addAll(text,button);		
		Scene scene = new Scene(hbox);
		stage.setScene(scene);
		stage.show();
		
	}

}

此时直接运行会报错错误:缺少JavaFX运行时组件,需要使用该组件来运行此程序。解决方法有两个,一个是配置JVM的启动项,将JavaFX的JDK目录添加进启动项里。点击Eclipse菜单栏的Run -> Run Configurations,在Java Application中找到刚才写的主类,点击右侧窗口中的(x)=Arguments,在下方的VM argument中输入:

--module-path "C:\Program Files\Java\javafx-sdk-11\lib" --add-modules javafx.controls,javafx.fxml,javafx.base

其中--module-path后跟JavaFX所造的目录。点击Apply应用配置,再次启动时就可以成功启动了。

另一种方法是新建一个启动类,用新的启动类来启动主类,绕开JavaFX对于运行时组件的检查

package com.scw;
public class AppLauncher {
	public static void main(String[] args) {
		Main.main(args);
	}
}

二、打包jar

使用maven的插件来打包成jar文件,maven配置如下:

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<version>3.0.0</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<transformers>
								<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<!-- 加载主类 -->
									<mainClass>com.puri.scw.AppLauncher</mainClass>
								</transformer>
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

注意<mainClass>中的值为主类的启动类。

然后在项目pom.xml所在目录下打开CMD,输入:

mvn clean package

会在target目录下生成两个文件。文件名带有original的是不包含依赖的jar包,另一个是带有依赖项的jar包。运行时需要运行带有依赖项的jar包。

如果电脑上已配置Java环境变量,并且安装的是Java11,此时可以直接在cmd中运行该文件,如

java -jar target\HelloJavaFX.jar

如果能够运行,则表明程序没有问题

三、定制jre环境(使用jlink)

使用jdeps命令来检查jar文件的依赖项

jdeps --module-path "C:\Program Files\Java\javafx-sdk-11\lib"  --list-deps target\HelloJavaFX-1.jar

其中,--module-path后面的是Javafx sdk所在目录,--list-deps命令用于打印所有的依赖项

输出如下:

java.base
javafx.base
javafx.graphics

我们定制jre时,就需要这三个依赖。输入下面的命令来生成一个定制的jre

jlink --module-path jmods --add-modules java.base,javafx,base,javafx.graphics --output myjre

其中--module-path后面的是jmods所在目录。--add-modules后面是要添加的依赖项,--output后面是输出jre的目录。上面的命令会在当前目录下生成一个myjre文件夹,文件夹内即定制的jre环境

如果之前没有把下载的JavaFX Jmods文件复制进jdk的Jmods文件夹,这里会报错。将文件复制进去即可。

注意,如果安装的是Java11并且已经配置了环境变量,可以直接使用jdeps和jlink命令,否则要完整输入jdk\bin文件目录

生成jre环境后,可以通过jre环境来运行生成的jar文件,看是否能正常运行

myjre\bin\java.exe -jar target\HelloJavaFX.jar

如果能正常运行,则定制的环境没有问题。

注意:如果电脑上配置了Java8的环境变量,这里即使使用定制的jre环境,程序仍然会运行失败,需要删除配置的Java8环境变量才能正常运行。

四、打包exe文件(使用exe4j)

exe4j软件可以自行在网上下载。安装后需要配置一个license,否则打包的exe文件每次启动时都会弹窗提示软件是exe4j打包的。

安装后打开软件,点击Next,在下一个页面里选择JAR in EXE mode

点击Next,在页面的第一栏输入程序名,第二栏选择程序的保存目录。最好和jar文件放在同一个目录,否则会需要把资源文件复制进exe文件所在目录才能运行

点击Next,在Executable name后输入exe文件的名称。可以在Icon File中指定程序图标。下面的第一个选项是是否只同时允许一个程序运行。最好勾选上,否则程序错误不显示界面时,有可能会发生很多个程序同时在后台占用资源的问题

Advanced Options中,可以选择是否生成64位程序。鉴于目前大部分电脑都是64位的,可以勾选上。然后点击页面下方的next,进入Configure options for the executable manifest页面。这个页面没有要改动的,直接点击next,进入Configure Java invocation页面。在这个页面选择jar文件,并在下方的Main class from后输入启动类的完整 名。如果打包后的软件中文乱码,可以在VM Parameters中设置编码。输入后点击next

在这个页面中输入软件的最大和最小Java版本。这里都输入11,因为是使用自己打包的jre环境。输入后,点击Advanced Options -> Search sequence,设置jre环境的选择顺序

在新的页面中,删掉所有的jre环境,点击绿色的加号,勾选Directory,然后选择定制的jre所在目录。最好将jre复制到输出文件目录中。设置完后,点击next

在这个页面选择Client hotspot VM(也可以用默认值),然后点击三次next,可以在输出文件目录下看到生成的exe文件

如果程序使用了资源文件,必须将资源文件复制进来才可以运行。

五、打包exe安装包(使用Inno Setup Compiler)

生成exe文件后,可以使用Inno Setup Compiler来进一步生成安装文件。如果之前生成的exe文件可以运行,那么这一步几乎不会出现问题。具体的方法可以参考 jdk11订制jre + JavaFX11打包exe可执行程序_xizi1103的博客-CSDN博客_java11 打包exe

六、一些备注

生成exe后的含jre运行环境的文件夹大约有100M,使用Winrar压缩后大约有40M,后续生成的exe安装文件大约也是40M

参考文档

javafx_xizi1103的博客-CSDN博客

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaFX可以通过使用场景(Scene)对象来实现场景切换。下面是一个简单的示例代码,演示了如何实现场景切换: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class SceneSwitchingExample extends Application { private Stage primaryStage; @Override public void start(Stage primaryStage) { this.primaryStage = primaryStage; // 创建两个场景 Scene scene1 = createScene("Scene 1", "Switch to Scene 2"); Scene scene2 = createScene("Scene 2", "Switch to Scene 1"); // 初始显示第一个场景 primaryStage.setScene(scene1); primaryStage.setTitle("Scene Switching Example"); primaryStage.show(); // 按钮点击事件,切换到另一个场景 Button button = (Button) scene1.getRoot().lookup("#button"); button.setOnAction(event -> primaryStage.setScene(scene2)); Button backButton = (Button) scene2.getRoot().lookup("#button"); backButton.setOnAction(event -> primaryStage.setScene(scene1)); } // 创建场景的辅助方法 private Scene createScene(String title, String buttonText) { Button button = new Button(buttonText); button.setId("button"); StackPane root = new StackPane(); root.getChildren().add(button); return new Scene(root, 300, 200); } public static void main(String[] args) { launch(args); } } ``` 在上面的示例中,我们创建了两个场景(scene1和scene2),并在每个场景中放置了一个按钮。按钮点击事件触发时,我们使用`setScene()`方法将当前场景切换到另一个场景。 这仅仅是一个简单的示例,你可以根据自己的需求进行场景的设计和切换。希

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值