Kotlin Multiplatform Development Help

Swing 互操作性

在这里,您将了解如何在 Compose Multiplatform 应用程序中使用 Swing 组件(反之亦然),这种互操作性的限制与优势,以及何时应该或不应该采用这种方案。

Compose Multiplatform 与 Swing 的互操作性旨在帮助您:

  • 简化 Swing 应用程序向 Compose Multiplatform 的迁移过程

  • 当 Compose 缺乏对应组件时,通过 Swing 组件增强 Compose Multiplatform 应用程序

多数情况下,直接在 Compose Multiplatform 中实现缺失组件(并贡献给社区)比在应用中混用 Swing 组件更高效。

Swing 互操作用例与限制

在 Swing 应用中嵌入 Compose Multiplatform 组件

第一种场景是在 Swing 应用中添加 Compose Multiplatform 组件。您可以通过 ComposePanel 这个 Swing 组件来渲染应用的 Compose 部分。对 Swing 而言, ComposePanel 只是另一个普通 Swing 组件。

注意:所有 Compose Multiplatform 组件(包括弹窗、工具提示和上下文菜单)都在 Swing 的 ComposePanel 内渲染,并受其尺寸和位置约束。因此建议考虑以下替代方案:

  • 使用基于 Swing 的实现替换这些组件

  • 尝试两项实验性功能: 离屏渲染

    允许直接在 Swing 组件上渲染 Compose 面板

    弹窗独立视图

    弹窗不再受初始可组合画布或应用窗口限制

典型 ComposePanel 使用场景:

  • 嵌入动画对象或整个动画面板(如表情选择器或带事件响应动画的工具栏)

  • 实现交互式渲染区域(如图形/信息图表),Compose Multiplatform 方案更简便

  • 集成复杂渲染区域(可能含动画),Compose Multiplatform 实现更简单

  • 替换 Swing 应用中复杂的 UI 部分,利用 Compose 的便捷布局系统和丰富内置组件

在 Compose Multiplatform 应用中嵌入 Swing 组件

第二种场景是使用 Swing 存在但 Compose Multiplatform 缺乏的组件。若从头实现耗时过长,可尝试 SwingPanel 。该函数作为包装器管理 Swing 组件的尺寸、位置和渲染。

注意: SwingPanel 中的 Swing 组件始终会覆盖在 Compose 组件上层,导致下层内容被裁剪。为避免显示问题:

  • 尝试实验性混合渲染

  • 若仍存在渲染风险,建议重新设计 UI 或直接实现缺失组件

典型 SwingPanel 使用场景:

  • 应用不需要弹窗/工具提示/上下文菜单,或至少不在 SwingPanel 内部使用

  • SwingPanel 保持固定位置(可降低组件移动时的显示异常风险)

Compose Multiplatform 与 Swing 可双向嵌套组合(如 SwingPanel 内嵌 ComposePanel 再内嵌 SwingPanel ),但需注意潜在渲染问题。代码示例参见嵌套布局

在 Swing 应用中使用 Compose Multiplatform

通过 ComposePanel 可在 Swing 应用中创建 Compose 界面。将其实例添加到 Swing 布局后,在 setContent 中定义组合内容:

(代码部分保持原文不变)
IntegrationWithSwing

实验性离屏渲染

该模式允许直接在 Swing 组件上渲染 Compose 面板,解决面板显示/隐藏/缩放时的过渡问题,并支持正确的层级混合(Swing 组件可显示在 ComposePanel 上方或下方)。

通过系统属性启用:

-Dcompose.swing.render.on.graphics=true

或入口点代码:

System.setProperty("compose.swing.render.on.graphics", "true")

实验性弹窗独立视图

该功能使工具提示等弹出元素不受初始画布或窗口限制(例如当可组合视图未全屏但需要显示对话框时)。

通过 compose.layers.type 属性配置:

  • WINDOW :将弹窗创建为独立无边框窗口

  • COMPONENT :在同一窗口创建为独立 Swing 组件(需同时启用离屏渲染)

代码示例参见弹窗组件模式

在 Compose Multiplatform 应用中使用 Swing

通过 SwingPanelfactory 参数创建 Swing JPanel

(代码部分保持原文不变)
SwingPanel

响应 Compose 状态更新

通过 update 回调在状态变化时更新 Swing 组件:

(代码部分保持原文不变)
SwingLabel

实验性混合渲染

默认情况下 SwingPanel 会矩形裁剪并置顶显示。通过实验性混合渲染可支持:

  • 非矩形裁剪(clipshadow 修饰符生效)

  • Compose 内容覆盖在 SwingPanel 上层

启用方式:

System.setProperty("compose.interop.blending", "true")

详细限制参见 GitHub 说明

嵌套布局实现

以下示例演示了 Swing-Compose-Swing 三级嵌套结构:

(代码部分保持原文不变)
Swing layout

下一步

探索其他桌面专属组件教程。

22 四月 2025