JavaFx入门 1—使用IDEA建立Maven项目并打包成可运行Jar
程序员文章站
2022-03-30 12:33:06
...
新建一个maven工程
这里可以随便填
建立完成后,可以参考下面修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sugar.fxapp</groupId>
<artifactId>fxapp.base2</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<!--本地maven 仓库的jar
IDEA maven项目通过点击install安装到本地仓库
-->
<dependency>
<groupId>sugar.baselibs</groupId>
<artifactId>sugar.utils</artifactId>
<version>1.01</version>
</dependency>
<dependency>
<groupId>sugar.baselibs</groupId>
<artifactId>sugar.fxapplibs</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxjava -->
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.2.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!--mainclass main方法-->
<mainClass>sugar.base2.FxApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
新建一个类 继承 Application
sugar.utils.fxapp.ResourcesUtils 是引用作者自己的一个类
后面会贴出代码
package base2;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import sugar.utils.fxapp.ResourcesUtils;
public class FxApp extends Application {
public static void main(String[] args) throws InterruptedException {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Stage stage = new Stage();
VBox vBox = new VBox();
vBox.getChildren().add(new ImageView(new Image(ResourcesUtils.getJarFilePath("home/bag_256px.png"))));
Scene scene = new Scene(vBox,800,500);
stage.setScene(scene);
stage.show();
}
}
这是sugar.utils.fxapp.ResourcesUtils
package sugar.utils.fxapp;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
public class ResourcesUtils {
public static void main(String[] args) throws IOException {
//GBK UTF8
ResourcesUtils.channelMapRead("test.txt","UTF8");
}
//加载jar包下资源
public static String getJarFilePath(String fileName){
URL resource = ResourcesUtils.class.getClassLoader().
getResource(fileName);
return resource.toString();
}
public static Parent getFxmlFile(String path) {
Parent p = null;
try {
p= FXMLLoader.load(ResourcesUtils.getUrl(path));
}catch (Exception e){
}
return p;
}
//获取resources下文件
public static File getResFile(String fileName){
URL url = ResourcesUtils.class.getClassLoader().getResource(fileName);
File file = new File(url.getFile());
return file;
}
public static URL getUrl(String fileName){
return ResourcesUtils.class.getClassLoader().getResource(fileName);
}
/**
* 使用map()方法一次将所有文件内容 映射到内存中
*
* 读取指定文件内容
* @param fileName
* @param targetEncode
* @return
*/
public static String channelMapRead(String fileName, String targetEncode) {
URL url = ResourcesUtils.class.getClassLoader().getResource(fileName);
File f = new File(url.getFile());
String str = null;
// Java7 新增 try后面加的括号
// 括号里面是必须显式关闭的物理资源,如数据库连接、网络连接、磁盘文件
// 在try语句结束时自动关闭该资源,不需要finally 判断关闭了
try (
// 创建FileInputStream,以该文件输入流创建FileChannel
FileChannel inChannel = new FileInputStream(f).getChannel();
) {
// 将FileChannel里的全部数据映射成ByteBuffer
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, f.length()); // ①
// 使用GBK的字符集来创建解码器
Charset charset = Charset.forName(targetEncode);
// 再次调用buffer的clear()方法,复原limit、position的位置
buffer.clear();
// 创建解码器(CharsetDecoder)对象
CharsetDecoder decoder = charset.newDecoder();
// 使用解码器将ByteBuffer转换成CharBuffer
CharBuffer charBuffer = decoder.decode(buffer);
// CharBuffer的toString方法可以获取对应的字符串
System.out.println(charBuffer.toString());
str = charBuffer.toString();
} catch (IOException ex) {
ex.printStackTrace();
}finally {
}
return str;
}
}
加载的资源位置在resources目录下
运行FxApp
关于打包成Jar比较简单,直接maven package,不是maven项目可以去
看一下这篇博客
IDAE打包 https://blog.csdn.net/wangmx1993328/article/details/80861363
使用命令行:
好像只有image可以成功!!!
javafxpackager -deploy -native image -appclass main类全称 -srcdir E:\soft-dev-workspace\javaPackage\jar -outdir E:\soft-dev-workspace\javaPackage\exe -outfile app名称 -name jar名称
参数详解,可以直接在cmd输入"javafxpackager",然后回车,可以看到所有参数信息
-deploy:打包程序根据其他参数生成 jnlp 和 html文件
-native:生成自包含的应用程序包 (如果可能), 如果指定了类型, 则只创建此类型的包,所支持类型的列表包括: installer, image, exe, msi, dmg, rpm 和 deb。
-appclass:要执行的应用程序类的限定名称,即程序入口类的全路径。
-srcdir:待打包文件的基目录。
-outdir:要将输出文件生成到的目录的名称。
-outfile:生成的文件的名称 (不带扩展名)。
折腾很长时间
使用工具去编译成dll给C#调用无果。
这个以后有时间再去研究。
更多关于JavaFX
TornadoFX编程指南,第1章,为什么选择TornadoFX?
https://www.jianshu.com/p/c7bb6bcb4f60
TornadoFx-Kotlin实战桌面应用开发之打包
https://blog.csdn.net/u010913414/article/details/91049623
//TornadoFX编程指南,第11章,编辑模型和验证
https://www.jianshu.com/p/13179bb9ffcf
其他 可以不阅读
//css
> .split-pane > .split-pane-divider {
-fx-padding: 0 0.25em 0 0.25em; /* 0 3 0 3 */
}
/* horizontal the two nodes are placed to the left/right of each other. */
.split-pane:horizontal > .split-pane-divider {
-fx-background-color: -fx-box-border, -fx-inner-border-horizontal;
-fx-background-insets: 0, 0 1 0 1;
}
/* vertical the two nodes are placed on top of each other. */
.split-pane:vertical > .split-pane-divider {
-fx-background-color: -fx-box-border, -fx-inner-border;
-fx-background-insets: 0, 1 0 1 0;
}
//---设置app图标
// File file =ResourcesUtils.getResFile("stage/cat.jpg");
// FileInputStream fileInputStream = new FileInputStream(file);
// primaryStage.getIcons().add(new Image(fileInputStream));
//使用css
//https://blog.csdn.net/moshenglv/article/details/82877676
//file:///C:/temp/a.css
//file:resources/custom.css
// URL url = ResourcesUtils.getUrl("custom.css");
// try {
// scene.getStylesheets().add("http://localhost:8029/res/scene2.css");
// } catch (Exception e) {
// e.printStackTrace();
// }
---------------成功的
// src/base下
URL url = ResourcesUtils.getUrl("fxml/TreeView.fxml");
// org.springframework.util.ResourceUtils.getURL("fxml/TreeView.fxml");
Parent root =
FXMLLoader.load(ResourceUtils.extractJarFileURL(url));
// 第3步
// 设置舞台的场景
// primaryStage.setResizable(false); // 设置舞台的尺寸是否允许变化
// primaryStage.initStyle(StageStyle.DECORATED);//正常显示 也是默认
// primaryStage.initStyle(StageStyle.TRANSPARENT);//三个组键都没有(最小化 最大化 关闭)
// primaryStage.initStyle(StageStyle.UNDECORATED);//背景透明
// primaryStage.initStyle(StageStyle.UNIFIED);//无title栏的背景颜色
// primaryStage.initStyle(StageStyle.UTILITY);//无最小化最大化 只有关闭按钮
//不打包可行
//加载本地文件
//从给定的URL中提取实际jar文件的URL(该URL可能指向jar文件中的资源或jar文件本身)。
//1.String.valueOf()转换url
String.valueOf(ResourceUtils.extractJarFileURL
(sugar.utils.fxapp.ResourcesUtils.getUrl("stage/scene2.css")))
//2.toExternalForm()转换url
scene.getStylesheets().add(ResourceUtils.extractJarFileURL
(sugar.utils.fxapp.ResourcesUtils.getUrl("stage/scene2.css"))).toExternalForm()
);
//3.
URL resource = UiService.class.getClassLoader().
getResource("stage/scene2.css");
String path = resource.toString();
scene.getStylesheets().add(path);
//加载音频
public void play()
{
URL thing = getClass().getResource("mysound.wav");
Media audioFile = new Media( thing.toString() );
try
{
MediaPlayer player = new MediaPlayer(audioFile);
player.play();
}
catch (Exception e)
{
System.out.println( e.getMessage() );
System.exit(0);
}
}