添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 项目编译工具:Gradle 8.2
  • 开发工具: Idea
  • 开发语言: 建议java17以上
  • ui组件:openjfx (org.openjfx.javafxplugin)
  • 打包工具: jpackage (org.beryx.jlink)
  • 如果打包出现错误,可以安装wix(3.1以上) + dotnetfx(3.5以上) 试试看

一、如何解决打包问题

java 14以后,有了jpackage工具,能够很方便的打包成exe,msi,dmg等包了。

如果有java环境的机器,可以使用launch4j进行打包(可以指定支持的运行时java环境版本min~max, 参考 https://github.com/charlydang/RestartApplicationButton), 可参考maven插件https://github.com/orphan-oss/launch4j-maven-plugin,这种方式打的包体积很小,但是需要运行的系统安装了对应的jvm环境才好。jpackage更适合没有java环境的机器,可以运行在任何一台机器上。

试了Maven项目的javafx-maven-plugin插件,发现没法打包成可安装的包exe或者msi。

最终选择了gradle管理项目(打包插件:badass-jlink-plugin),如果有idea最新版的话,新建JavaFx、gradle的项目默认用的就是这个插件。不过要稍微改下配置。具体参数配置可以查看github: https://github.com/beryx/badass-jlink-plugin, readme里有介绍几个例子。我是参考这个例子https://github.com/beryx-gist/badass-jlink-example-log4j2-javafx进行的配置。也可以看看这个项目,挺不错的(地址 https://github.com/gleidsonmt/DashboardFx)。

plugins {
    id 'java'
    id 'application'
    id 'org.javamodularity.moduleplugin' version '1.8.12'
    id 'org.openjfx.javafxplugin' version '0.0.13'
    id 'org.beryx.jlink' version '2.25.0'
group 'com.example'
version '1.0'
repositories {
    mavenCentral()
ext {
    junitVersion = '5.9.1'
sourceCompatibility = '17'
targetCompatibility = '17'
dependencies {
    implementation('org.apache.logging.log4j:log4j-core:2.11.1')
    testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
application {
    mainModule = 'com.example.app'
    mainClass = 'com.example.app.Main'
javafx {
    version = '17.0.2'
    modules = ['javafx.controls', 'javafx.fxml']
dependencies {
    implementation('org.controlsfx:controlsfx:11.1.2')
    implementation('org.kordamp.bootstrapfx:bootstrapfx-core:0.4.0')
    testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
test {
    useJUnitPlatform()
jlink {
    imageZip = project.file("${buildDir}/distributions/app-${javafx.platform.classifier}.zip")
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
    //app名称
        name = 'TestAppName'
    forceMerge('log4j-api','fastjson')
    jpackage {
        if (org.gradle.internal.os.OperatingSystem.current().windows) {
//            installerType = 'exe'
            installerOptions += ['--win-per-user-install', '--win-dir-chooser', '--win-menu', '--win-shortcut']
//            imageOptions += ['--win-console']
jlinkZip {
    group = 'distribution'

我用idea创建了一个demo项目,提交到github上了,可以在这里看。https://github.com/carlzhangweiwen/hello-world/tree/master/javafx-jpackage-demo

注意,如果要加icon, 那么图片格式必须是ico,不然会报错;
idea默认创建的version会加一个snapshot, jpackage打包的时候会报错,要改成正常的版本号,比如1.0或者1都可以。
在这里插入图片描述

jpackage 的配置参数可以通过官网了解: https://docs.oracle.com/en/java/javase/21/docs/specs/man/jpackage.html

二、JavaFX开发(使用Scene Builder)

JavaFX是类似Android的开发模式,界面布局使用FXML,使用scene builder可以直接拖拽控件进行布局,可视化的布局。界面支持CSS调样式。支持ResourceBoundle,进行国际化设置。控件多,灵活,支持图表展示和WebView.

scene builder 怎么用?可以参考这篇文章https://blog.csdn.net/weixin_41571493/article/details/81415327,写的很详细。
scene builder下载地址 https://gluonhq.com/products/scene-builder/
在这里插入图片描述

三、获取程序安装路径

比如程序叫demo,安装到了C://demo , 则可以通过下面命令获取到。那么一些缓存文件等都可以放在这个目录了。

System.getProperty("user.dir")

参考自如下命令(如果继承了Application,则会有getHostServices方法可以调用)

final HostServices hostServices = getHostServices();
String codeBase = hostServices.getCodeBase() +"|doc:"+ hostServices.getDocumentBase();

四、选择本地文件或目录

选择一个文件

  @FXML
    private AnchorPane toolAnchorPane;
     @FXML
    void click(ActionEvent event) {
        final Window window = toolAnchorPane.getScene().getWindow();
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Open Resource File");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("Text Files", "*.txt"),
                new FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"),
                new FileChooser.ExtensionFilter("Audio Files", "*.wav", "*.mp3", "*.aac"),
                new FileChooser.ExtensionFilter("All Files", "*.*"));
        File selectedFile = fileChooser.showOpenDialog(window);
     DirectoryChooser directoryChooser = new DirectoryChooser();
        final File selectedFile = directoryChooser.showDialog(window);
        System.out.println(selectedFile);
        folderPath.setText(selectedFile.getAbsolutePath());

五、java如何调用本地函数库

可以采用开源库Java Native Access(jna)。JNA 使 Java 程序可以轻松访问本机共享库(native shared libraries),而无需编写 Java 代码之外的任何内容 - 不需要 JNI 或本机代码。 此功能可与 Windows 的 Platform/Invoke 和 Python 的 ctypes 相媲美。

    implementation("net.java.dev.jna:jna:5.14.0")
    implementation("net.java.dev.jna:jna-platform:5.14.0")

如下是隐藏或展示photoshop的ui,让其在后台运行

import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef; public class Demo { // This is the standard, stable way of mapping, which supports extensive // customization and mapping of Java to native types. public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.load((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); void printf(String format, Object... args); public static void main(String[] args) { CLibrary.INSTANCE.printf("Hello, World\n"); for (int i=0;i < args.length;i++) { CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]); // 隐藏或展示photoshop的ui hideOrShowWindowsApp("Photoshop"); //https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow public static void hideOrShowWindowsApp(String applicationTitle) { User32 user32 = User32.INSTANCE; WinDef.HWND hWnd = user32.FindWindow(applicationTitle,null ); if (user32.IsWindowVisible(hWnd)) { user32.ShowWindow(hWnd, User32.SW_HIDE); }else{ user32.ShowWindow(hWnd, User32.SW_SHOW); // user32.SetFocus(hWnd);
  1. openjfx: https://openjfx.io/
  2. openjfx关联的文档: https://fxdocs.github.io/docs/html5/
  3. openjfx关联的文档: https://jenkov.com/tutorials/javafx/index.html
  4. jna: https://github.com/java-native-access/jna
1.不支持语音树洞(无法发表语音树洞,并且对于手机端发表的语言树洞无法收听其内容); 2.树洞或评论页面载入刷新后进度条可能不在最上头; 3.加载树洞或评论页面,搜索树洞,进行登录,发表树洞、评论以及设置关注等需要联网的操作时,界面可能会有短暂卡顿。 欢迎反馈使用过程中遇到的bug~ 以及,欢迎熟悉java的同学指出代码中的不足或漏洞~ 关于客户端使用:需要下载对应自己操作系统的JRE8(Java运行时环境),下载链接 根据自己系统是linux,windows或者Mac OS等,以及系统是32位还是64位,选择正确的JRE进行下载安装。
Java编写一款客户端软件:初学者指南 作为一名刚入行的开发者,你可能对如何使用Java编写一款客户端软件感到困惑。不用担心,本文将为你提供一份详细的指南,帮助你从零开始,逐步构建自己的Java客户端软件。 首先,让我们通过一个表格来概览整个开发流程:
前言:本文只介绍IntelliJ IDEA环境下如何搭建javafx+maven+spring的开发环境和一些必要的知识点,javafx详细开发不在此范畴 1 框架搭建 1.1 创建一个springboot工程 下一步,注意springboot要使用1.5.X的版本,推荐使用1.5.22.RELEASE: 因为只搭建一个简单的框架,所以其他依赖都没选,下一步: 创建完成后,pom文件添加javafx的springboot的支持库,支持库有很多,我使用的是springboot-javafx-
jcabi-http 是一个非常简单的 Java HTTP 客户端开发包。示例代码: String html = new JdkRequest("https://www.oschina.net/")   .uri().path("/users").queryParam("id", 333).back()   .method(Request.GET)   .header("Accept", "text/html")   .fetch()   .as(RestResponse.class)   .assertStatus(HttpURLConnection.HTTP_OK)   .body(); Maven: <dependency>   <groupId>com.jcabi</groupId>   <artifactId>jcabi-http</artifactId>   <version>1.8.2</version> </dependency> 标签:jcabi
基于 Java 的在线答题系统(服务端+客户端pc端))。 本系统实现了在线答题系统,包括答题系统的后台管理系统,可以自由添加题目选项信息,客户端菜品H5页面,Ajax提交和获取数据,具体说明请看:https://www.jianshu.com/p/1b2ca978c50b 在线答题系统 JFinal Spring MVC MySQL
Java开发PC客户端可以通过混合开发的方式实现。这种方法结合了Java的跨平台性和C语言的高执行效率。使用JNI(Java Native Interface)技术,可以在Java代码中调用本地方法(Native Method),实现更高效、更灵活的程序设计。 在开发Java PC客户端时,可以使用JavaFX作为图形界面库。JavaFX是Java的一个GUI框架,从JDK版本1.8开始内置了JavaFX的开发包。如果使用其他版本的JDK,可能需要下载对应的JavaFX的开发包。 以下是一个Java开发PC客户端的常用方法的示例代码: ```java package MoneySystem; import java.awt.*; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class MoneyJFrame { public static void main(String[] agrs) { JFrame jf=new JFrame("Java第二个GUI程序"); //创建一个JFrame对象 jf.setBounds(300, 100, 400, 200); //设置窗口大小和位置 JPanel jp=new JPanel(); //创建一个JPanel对象 JLabel jl=new JLabel("这是放在JPanel上的标签"); //创建一个标签 jp.setBackground(Color.white); //设置背景色 jp.add(jl); //将标签添加到面板 jf.add(jp); //将面板添加到窗口 jf.setVisible(true); //设置窗口可见 这个示例代码创建了一个简单的窗口,并在窗口上添加了一个面板和一个标签。通过调用JFrame、JPanel和JLabel等Swing组件,可以实现各种复杂的PC客户端界面。你可以根据自己的需求,添加更多的组件和功能来开发Java PC客户端应用程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java与C语言混合开发技术](https://download.csdn.net/download/milk416666/88249349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JavaFX制作PCJava程序~记录篇](https://blog.csdn.net/qq_45502336/article/details/127503764)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [如何用JAVA写一个简单的电脑客户端应用](https://blog.csdn.net/RK_Dangerous/article/details/125453774)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]