我正在开发一个使用 JavaFX(不是 fxml)并导出为 JAR 的 GUI 应用程序。对于慢速机器,不耐烦的用户在 JAR 上单击多次,并且启动了多个应用程序实例。
我正在寻找一种解决方案,让系统上一次只能运行一个实例,并且如果用户在应用程序运行时再次单击,则不会发生任何情况。我认为这叫单例,但不知道如何实现。
你可以尝试JUnique。它是一个开源库,完全可以满足您的要求。将
junique-1.0.4.jar
作为库导入到您的项目中。这只是 10kb 文件。
它的手册巧妙地描述了如何在项目中实现它。对于 JavaFX 应用程序,实现将如下所示:
确保将这些类导入到您的主目录中
import it.sauronsoftware.junique.AlreadyLockedException;
import it.sauronsoftware.junique.JUnique;
public static void main(String[] args) {
String appId = "myapplicationid";
boolean alreadyRunning;
try {
JUnique.acquireLock(appId);
alreadyRunning = false;
} catch (AlreadyLockedException e) {
alreadyRunning = true;
}
if (!alreadyRunning) {
launch(args); // <-- This the your default JavaFX start sequence
}else{ //This else is optional. Just to free up memory if you're calling the program from a terminal.
System.exit(1);
}
}
我使用的一个简单的解决方案是,当您启动应用程序时,它会创建一个文件(我将其命名为
.lock
,但您可以随意命名它),除非该文件已经存在,在这种情况下应用程序将终止它的执行而不是创建文件。
您需要将您的应用程序与资源绑定。它可以是文件、端口等。 您可以在启动时更改代码以检查文件是否被锁定。下面的代码会给你一些想法
FileOutputStream foStream = new FileOutputStream("/tmp/testfile.txt");
FileChannel channel = fileOutputStream.getChannel();
FileLock lock = channel.lock();
如果您将 JavaFX 代码正确打包为真正的应用程序,而不是仅仅将其扔进 jar 中,您可能会免费获得该功能,并且无需所有这些技巧。如果我使用 jpackage 工具在 Mac 上打包 JavaFX 代码,结果将是一个功能齐全的 macOS 应用程序。这意味着当我在某处双击其图标多次时,只会启动该应用程序的一个实例。这是 Mac 上的默认行为,正确打包的 JavaFX 应用程序也遵循该规则。但我不能说 Windows 或 Linux 上的行为是什么,因为我目前没有运行这样的盒子。也许知道的人可以将此添加为评论。
这些对我都没有帮助。我的所有计算机上都有 Paint Shop Pro,它会在除一台计算机之外的所有计算机上打开一个实例。对于所有其他的,我可以双击资源管理器中的图像,它会将该图像添加到已经打开的 Paint Shop Pro 中。但在一台计算机上,它会打开一个单独的实例。
相同的 Paint Shop Pro(旧版本 - 版本 7)和相同的操作系统,Windows 10。神秘。