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
中定义组合内容:

实验性离屏渲染
该模式允许直接在 Swing 组件上渲染 Compose 面板,解决面板显示/隐藏/缩放时的过渡问题,并支持正确的层级混合(Swing 组件可显示在 ComposePanel
上方或下方)。
通过系统属性启用:
或入口点代码:
实验性弹窗独立视图
该功能使工具提示等弹出元素不受初始画布或窗口限制(例如当可组合视图未全屏但需要显示对话框时)。
通过 compose.layers.type
属性配置:
WINDOW
:将弹窗创建为独立无边框窗口COMPONENT
:在同一窗口创建为独立 Swing 组件(需同时启用离屏渲染)
代码示例参见弹窗组件模式。
在 Compose Multiplatform 应用中使用 Swing
通过 SwingPanel
的 factory
参数创建 Swing JPanel
:

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

实验性混合渲染
默认情况下 SwingPanel
会矩形裁剪并置顶显示。通过实验性混合渲染可支持:
非矩形裁剪(
clip
和shadow
修饰符生效)Compose 内容覆盖在
SwingPanel
上层
启用方式:
详细限制参见 GitHub 说明。
嵌套布局实现
以下示例演示了 Swing-Compose-Swing 三级嵌套结构:

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