ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java如何开发PC客户端(Windows,Mac,Linux) [打印本页]

作者: 南七星之家    时间: 2024-7-30 23:31
标题: Java如何开发PC客户端(Windows,Mac,Linux)
一、如何解决打包问题

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)。
  1. plugins {
  2.     id 'java'
  3.     id 'application'
  4.     id 'org.javamodularity.moduleplugin' version '1.8.12'
  5.     id 'org.openjfx.javafxplugin' version '0.0.13'
  6.     id 'org.beryx.jlink' version '2.25.0'
  7. }
  8. group 'com.example'
  9. version '1.0'
  10. repositories {
  11.     mavenCentral()
  12. }
  13. ext {
  14.     junitVersion = '5.9.1'
  15. }
  16. sourceCompatibility = '17'
  17. targetCompatibility = '17'
  18. dependencies {
  19.     implementation('org.apache.logging.log4j:log4j-core:2.11.1')
  20.     testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
  21.     testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
  22. }
  23. tasks.withType(JavaCompile) {
  24.     options.encoding = 'UTF-8'
  25. }
  26. application {
  27.     mainModule = 'com.example.app'
  28.     mainClass = 'com.example.app.Main'
  29. }
  30. javafx {
  31.     version = '17.0.2'
  32.     modules = ['javafx.controls', 'javafx.fxml']
  33. }
  34. dependencies {
  35.     implementation('org.controlsfx:controlsfx:11.1.2')
  36.     implementation('org.kordamp.bootstrapfx:bootstrapfx-core:0.4.0')
  37.     testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
  38.     testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
  39. }
  40. test {
  41.     useJUnitPlatform()
  42. }
  43. jlink {
  44.     imageZip = project.file("${buildDir}/distributions/app-${javafx.platform.classifier}.zip")
  45.     options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
  46.     launcher {
  47.     //app名称
  48.         name = 'TestAppName'
  49.     }
  50.     forceMerge('log4j-api','fastjson')
  51.     jpackage {
  52.         if (org.gradle.internal.os.OperatingSystem.current().windows) {
  53. //            installerType = 'exe'
  54.             installerOptions += ['--win-per-user-install', '--win-dir-chooser', '--win-menu', '--win-shortcut']
  55. //            imageOptions += ['--win-console']
  56.         }
  57.     }
  58. }
  59. jlinkZip {
  60.     group = 'distribution'
  61. }
复制代码
我用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 , 则可以通过下面下令获取到。那么一些缓存文件等都可以放在这个目录了。
  1. System.getProperty("user.dir")
复制代码
参考自若下下令(假如继续了Application,则会有getHostServices方法可以调用)
  1. final HostServices hostServices = getHostServices();
  2. String codeBase = hostServices.getCodeBase() +"|doc:"+ hostServices.getDocumentBase();
复制代码
四、选择本地文件或目录

选择一个文件
  1.   @FXML
  2.     private AnchorPane toolAnchorPane;
  3.      @FXML
  4.     void click(ActionEvent event) {
  5.         final Window window = toolAnchorPane.getScene().getWindow();
  6.         FileChooser fileChooser = new FileChooser();
  7.         fileChooser.setTitle("Open Resource File");
  8.         fileChooser.getExtensionFilters().addAll(
  9.                 new FileChooser.ExtensionFilter("Text Files", "*.txt"),
  10.                 new FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"),
  11.                 new FileChooser.ExtensionFilter("Audio Files", "*.wav", "*.mp3", "*.aac"),
  12.                 new FileChooser.ExtensionFilter("All Files", "*.*"));
  13.         File selectedFile = fileChooser.showOpenDialog(window);
  14.     }
复制代码
选择目录
  1.      DirectoryChooser directoryChooser = new DirectoryChooser();
  2.         final File selectedFile = directoryChooser.showDialog(window);
  3.         System.out.println(selectedFile);
  4.         folderPath.setText(selectedFile.getAbsolutePath());
复制代码
五、java如何调用本地函数库

可以接纳开源库Java Native Access(jna)。JNA 使 Java 程序可以轻松访问本机共享库(native shared libraries),而无需编写 Java 代码之外的任何内容 - 不需要 JNI 或本机代码。 此功能可与 Windows 的 Platform/Invoke 和 Python 的 ctypes 相媲美。
引入依赖
  1.     implementation("net.java.dev.jna:jna:5.14.0")
  2.     implementation("net.java.dev.jna:jna-platform:5.14.0")
复制代码
如下是隐蔽或展示photoshop的ui,让其在后台运行
  1. import com.sun.jna.Library;
  2. import com.sun.jna.Native;
  3. import com.sun.jna.Platform;
  4. import com.sun.jna.platform.win32.User32;
  5. import com.sun.jna.platform.win32.WinDef;
  6. public class Demo {
  7.     // This is the standard, stable way of mapping, which supports extensive
  8.     // customization and mapping of Java to native types.
  9.     public interface CLibrary extends Library {
  10.         CLibrary INSTANCE = (CLibrary)
  11.         Native.load((Platform.isWindows() ? "msvcrt" : "c"),
  12.         CLibrary.class);
  13.         void printf(String format, Object... args);
  14.     }
  15.     public static void main(String[] args) {
  16.         CLibrary.INSTANCE.printf("Hello, World\n");
  17.         for (int i=0;i < args.length;i++) {
  18.             CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
  19.         }
  20.         // 隐藏或展示photoshop的ui
  21.         hideOrShowWindowsApp("Photoshop");
  22.     }
  23.     //https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow
  24.     public static void hideOrShowWindowsApp(String applicationTitle) {
  25.         User32 user32 = User32.INSTANCE;
  26.         WinDef.HWND hWnd = user32.FindWindow(applicationTitle,null );
  27.         if (user32.IsWindowVisible(hWnd)) {
  28.             user32.ShowWindow(hWnd, User32.SW_HIDE);
  29.         }else{
  30.             user32.ShowWindow(hWnd, User32.SW_SHOW);
  31.             //      user32.SetFocus(hWnd);
  32.         }
  33.     }
  34. }
复制代码

相关文档

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4