欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaFx入门 1—使用IDEA建立Maven项目并打包成可运行Jar

程序员文章站 2022-03-30 12:33:06
...

新建一个maven工程

JavaFx入门 1—使用IDEA建立Maven项目并打包成可运行Jar

这里可以随便填

JavaFx入门 1—使用IDEA建立Maven项目并打包成可运行Jar

建立完成后,可以参考下面修改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目录下

JavaFx入门 1—使用IDEA建立Maven项目并打包成可运行Jar

运行FxApp

JavaFx入门 1—使用IDEA建立Maven项目并打包成可运行Jar

关于打包成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:生成的文件的名称 (不带扩展名)。

JavaFx入门 1—使用IDEA建立Maven项目并打包成可运行Jar

折腾很长时间
使用工具去编译成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);
    }
}