问题标签 [compose-desktop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
80 浏览

gradle - 撰写桌面项目:如何在不提交的情况下包含 API 密钥(或其他机密)?

Compose Desktop项目中,我们如何在不提交的情况下管理密钥?

在 Android 项目中,Gradle 具有buildConfigField()resValue()功能。它们将BuildConfig.java在编译期间生成,我们可以在运行时使用这些值。

例如,在一个 Android 项目中,首先,我们创建两个环境变量 —RELEASE_API_KEYSTAGING_API_KEY(它可以是本地计算机,也可以是 CI/CD 环境)。

然后在 build.gradle 文件中我们可以说:

..在 Kotlin 代码中我们可以使用:

Compose Desktop项目中是否有类似的方法,以便:

  1. 我不必将秘密提交到源存储库?
  2. 我可以在 CI/CD 环境中轻松配置机密吗?
0 投票
0 回答
9 浏览

compose-desktop - 使用“verticalScroll”修饰符时撰写桌面“ClassNotFoundException”

ClassNotFoundException使用verticalScroll修饰符时出现错误,使用 LazyColumn 时也出现相同的错误。

我正在使用撰写版本1.0.1,但它与1.0.0

谁能帮我解决这个问题?

谢谢

0 投票
1 回答
27 浏览

kotlin - 如何在 Jetpack Compose 中以便携的方式实现计时器?

我想写一些应用程序,我希望某些事情按计划发生。

每隔几分钟轮询一次 URL 以获取更新似乎是一个相当常见的用例。不过,在这种特殊情况下,我只是想实现一个时钟。

这有效:

但是我必须 import java.util.Timer,所以它不会是便携式的。

Jetpack Compose 可以做动画,所以它肯定在某个地方有自己的计时器,这意味着应该有一些可移植的方式来做到这一点,但我似乎无法弄清楚。

有没有一种跨平台的方式来为此目的获取计时器?

0 投票
0 回答
30 浏览

kotlin - 如何在 IntelliJ-IDEA 中使用 Compose for Desktop 编译 MSI 包?

我正在尝试使用创建 Compose for Desktop 应用程序的 MSI 独立包

./gradlew package

在 IntelliJ-IDEA 终端中,但我总是得到:

任务:createRuntimeImage 失败

我刚刚创建了 IDE 建议的 Compose for Desktop 示例项目(使用“新建项目”向导)并尝试编译它但没有成功。我使用的是 Windows 11,安装了 JDK 17 以及 MinGW。Kotlin 版本是 1.5.31,Compose 版本是 1.0.0。我可以通过右键单击“Main.kt”和“运行”来运行应用程序。尝试打包时的终端输出为:

任务“:createRuntimeImage”执行失败。外部工具执行失败:

  • 命令:[C:\Program Files\Java\jdk-17.0.2\bin\jlink.exe, @C:\Users\MyUserName\IdeaProjects\untitled\build\compose\tmp\createRuntimeImage.args.txt]
  • 工作目录:[]
  • 退出代码:1
  • 标准输出日志:C:\Users\MyUserName\IdeaProjects\untitled\build\compose\logs\createRuntimeImage\jlink-2022-02-22-18-50-47-out.txt
  • 错误日志:C:\Users\MyUserName\IdeaProjects\untitled\build\compose\logs\createRuntimeImage\jlink-2022-02-22-18-50-47-err.txt

“[...]-err.txt”文件为空,“[...]-out.txt”文件包含:

错误:C:\Users\MyUserName\IdeaProjects

最后,“[...].args.txt”文件包含:

"java.desktop" --add-modules "java.logging" --add-modules "jdk.crypto.ec" --strip-debug --no-header-files --no-man-pages --strip-本机命令 -- 输出 "C:\Users\MyUserName\IdeaProjects\untitled\build\compose\tmp\main\runtime"

我将其运行为:

这是输出:

org.gradle.api.tasks.TaskExecutionException:任务“:createRuntimeImage”执行失败。org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:188) org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263) org.gradle。 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:174) 在 org.gradle.api.internal 的 api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:186)。 tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109) 在 org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) 在 org.gradle.api.internal.tasks.execution。解决任务执行模式执行器。

原因:java.lang.IllegalStateException:外部工具执行失败:在 org.jetbrains.compose.desktop.application.internal 的 org.jetbrains.compose.desktop.application.internal.ExternalToolRunner.invoke(ExternalToolRunner.kt:71)。 ExternalToolRunner.invoke$default(ExternalToolRunner.kt:22) at org.jetbrains.compose.desktop.application.tasks.AbstractJvmToolOperationTask.run(AbstractJvmToolOperationTask.kt:70) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 org.gradle 的 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)。 internal.reflect.JavaMethod.invoke(JavaMethod.java:104) 在 org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction。doExecute(IncrementalInputsTaskAction.java:32) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTask​​Action.execute(AbstractIncrementalTask​​Action. java:25) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:506 ) 在 org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) 在 org.gradle.internal.operations 的 org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)。 DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75) 在 org.gradle.internal.operations。DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56) 在 org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74) 在 org.gradle.internal.operations.UnmanagedBuildOperationWrapper .runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45) 在 org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:491) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:474) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:106 ) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:249) 在 org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:83) 在 org.gradle .internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:37) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50) at org.gradle.internal.execution.steps .ExecuteStep$1.call(ExecuteStep.java:47) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner. java:195)在 org.gradle 的 org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)。internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java :68) 在 org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79) 在 org.gradle.internal 的 org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62) .operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54) 在 org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79) 在 org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java :47) 在组织。gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:37) 在 org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) 在 org.gradle.internal.execution.steps。 RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:50) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java: 36) 在 org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74) 在 org.gradle.internal 的 org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41) .execution.steps.TimeoutStep.execute(TimeoutStep.java:55) 在 org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51) 在 org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:54) 在 org.gradle.internal 的 org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29) .execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:35) 在 org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60) 在 org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute (BroadcastChangingOutputsStep.java:27) 在 org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:174) 在 org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:74) 在org.gradle.internal 的 org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:45)。execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:40) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:29) at org.gradle.internal.execution.steps.RecordOutputsStep.execute( RecordOutputsStep.java:36) 在 org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22) 在 org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:99) 在 org .gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:92) 在 org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52) 在 org.gradle.internal。 execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36) 在 org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:85) 在 org.gradle。internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:42) 在 org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) 在 org.gradle.internal.execution.steps。 legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) 在 org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:91) 在 org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep. java:49) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:106) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:51) at org.gradle .internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:72) 在 org.gradle。internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:46) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:86) at org.gradle.internal.execution.steps .SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86) 在 org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:32) 在 org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep .java:38) 在 org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:43) 在 org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:31) 在 org. org.gradle.api.internal 的 gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)。tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$2.withWorkspace(ExecuteActionsTaskExecuter.java:284) 在 org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40) 在 org.gradle.internal.execution.steps.AssignWorkspaceStep .execute(AssignWorkspaceStep.java:30) 在 org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37) 在 org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27) ) 在 org.gradle.internal 的 org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33) 的 org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)。 execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter。在 org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter. java:109) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)在 org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) 在 org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) .api.internal.tasks.execution.CatchExceptionTaskExecuter。在org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call( EventFiringTaskExecuter.java:55) 在 org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) 在 org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200 ) 在 org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75) 在 org.gradle.internal.operations 的 org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195) .DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68) 在 org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68) 在 org.gradle.internal.operations.DefaultBuildOperationRunner 的 org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153) .call(DefaultBuildOperationRunner.java:62) at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79) at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)在 org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79) 在 org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) 在 org.gradle.execution.plan .LocalTask​​NodeExecutor。在 org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:395) 处执行(LocalTask​​NodeExecutor.java:74)在 org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:388) 在 org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:374) 在 org.gradle.execution.plan .DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127) 在 org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191) 在 org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker。executeNextNode(DefaultPlanExecutor.java:182) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)在 org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) 在 org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)运行(ThreadFactoryImpl.java:56)运行(ThreadFactoryImpl.java:56)

我尝试过更改 Kotlin、Compose 和 JDK 版本,但无法解决。尽管我对此进行了很多搜索,但其他解决方案似乎对我不起作用。任何帮助将不胜感激!

0 投票
0 回答
37 浏览

windows - 如何更改 Windows PowerShell 通知中的应用程序名称?

我正在使用 jetpack compose 开发一个桌面应用程序,它大量使用 windows toast 通知功能。我使用 PowerShell 脚本通过BurntToast模块推送 toast 通知。通知工作正常,但每次执行时,我都会将 Windows Powershell 视为应用程序名称,而不是任何自定义名称。

PowerShell 通知图像:

PowerShell 通知图像

如何将名称从 Windows PowerShell 更改为我想要的名称?

0 投票
0 回答
37 浏览

kotlin - 使用 java.util.Properties 驱动 Compose 状态

我正在使用Compose for Desktop为我的桌面应用程序设计一个 GUI 。如果应用程序关闭并重新打开,一些 GUI 组件需要保留 — 一些 GUI 组件还需要根据某些状态进行更改。为此,我使用了一个简单的java.util.Properties对象来存储信息(我已经扩展Properties为在调用时将其内容存储到文件setProperty中)。

例如,我希望在更改语言环境时更新 GUI 组件。当用户更改语言环境时,我设置了该属性,类似于:

然后我想要一个ResourceBundle——由一个状态定义的——更新。我尝试过这样的事情:

GUI 的文本元素使用i18n对象来获取它们的字符串。

但是,如果我调用launcherState.setProperty("locale", "fr"),locale并且i18n不更新(因此 GUI 不会更新)——我相信他们无论如何都不应该这样做。

所以我的问题是,我怎样才能使launcherState“可观察”,以便当我对其进行更改时,状态会更新?或者,我应该采取完全不同的方法。

0 投票
0 回答
23 浏览

ffmpeg - 如何将 AVFrame 转换为 Compose Image?

这是大概的代码,但它不显示图像。此代码有效。但是什么都没有显示。

从这里获取示例代码

任务是在 ffmpeg 上制作一个播放器。

0 投票
0 回答
12 浏览

macos - 使用撰写桌面在 MacO 上获取资源目录失败

我从 jetpack compose desktop lib 的演示中复制了代码,但得到了错误的 dir("/")。谁能告诉我有什么问题?谢谢你。

(jetpack compose 桌面库:https ://github.com/JetBrains/compose-jb/blob/master/tutorials/Native_distributions_and_local_execution/README.md )

0 投票
0 回答
9 浏览

kotlin - 自定义 Compose Desktop 双击的选择行为

是否有任何方法可以自定义 Compose Desktop 在执行双击时考虑的连续字符?

例如,如果我有这个:

那里的 Unicode 字符不被视为同一令牌的一部分,因此当我在其中一个数字内双击时,它不会选择整个数字:

默认选择行为的屏幕截图

这使得复制文本有点不方便,至少对于知道双击存在的高级用户来说。

我查看了文档SelectionContainer,它确实需要一个修饰符,但并不总是清楚哪些修饰符可能可用。

0 投票
0 回答
9 浏览

compose-desktop - 将本机二进制文件添加到 jetpack compose 包

我的 Jetpack Compose Desktop 应用程序依赖于我想包含在 Debian 包中的专有可执行文件。我得到的最接近的是将文件添加为资源,但这不会设置可执行标志。

是否有另一种在 packageDeb 任务中包含文件的方法,可以保留可执行标志?