Здесь вы узнаете, как использовать компоненты Swing в приложении Compose Multiplatform и наоборот, каковы ограничения и преимущества такого взаимодействия, а также в каких случаях стоит или не стоит использовать этот подход.
Взаимодействие Compose Multiplatform и Swing призвано помочь вам:
Упростить и облегчить перенос приложений Swing на Compose Multiplatform.
Расширить возможности приложений Compose Multiplatform с помощью компонентов Swing, если аналоги в Compose отсутствуют.
Во многих случаях эффективнее реализовать отсутствующий компонент непосредственно в Compose Multiplatform (и внести его в сообщество), чем использовать компонент Swing в приложении Compose Multiplatform.
Сценарии использования и ограничения взаимодействия со Swing
Компонент Compose Multiplatform в приложении Swing
Первый сценарий — добавление компонента Compose Multiplatform в приложение Swing. Это можно сделать с помощью компонента Swing ComposePanel, который отображает часть приложения на Compose Multiplatform. С точки зрения Swing, ComposePanel — это ещё один компонент Swing, с которым он работает соответствующим образом.
Обратите внимание: все компоненты Compose Multiplatform, в том числе всплывающие окна, подсказки и контекстные меню, отображаются внутри ComposePanel Swing и позиционируются и изменяют размер внутри него. Поэтому рассмотрите возможность заменить эти компоненты реализациями на основе Swing или попробовать две новые экспериментальные функции:
Всплывающие окна больше не ограничены исходным холстом компонуемого элемента или окном приложения.
Ниже приведены несколько сценариев использования ComposePanel:
Встраивание анимированных объектов или целой панели с анимированными объектами в приложение (например, выбора эмотиконов или панели инструментов с анимированными реакциями на события).
Реализация интерактивной области отображения, например графики или инфографики, которую проще и удобнее создать с помощью Compose Multiplatform.
Интеграция в приложение сложной области отображения, возможно даже анимированной, которую проще создать с помощью Compose Multiplatform.
Замена сложных частей пользовательского интерфейса приложения на Swing: Compose Multiplatform предоставляет удобную систему компоновки компонентов, широкий набор встроенных компонентов и возможностей для быстрого создания пользовательских компонентов.
Компонент Swing в приложении Compose Multiplatform
Другой сценарий — когда нужно использовать компонент, который есть в Swing, но не имеет аналога в Compose Multiplatform. Если создание новой реализации с нуля отнимает слишком много времени, попробуйте SwingPanel. Функция SwingPanel служит обёрткой, которая управляет размером, положением и отображением компонента Swing, размещённого поверх компонента Compose Multiplatform.
Обратите внимание: компонент Swing внутри SwingPanel всегда будет находиться поверх компонента Compose Multiplatform, поэтому всё, что расположено под вашим SwingPanel, будет обрезано компонентом Swing. Чтобы избежать обрезки и наложения, попробуйте экспериментальное смешивание при взаимодействии. Если риск некорректного отображения всё ещё сохраняется, можно соответствующим образом переработать интерфейс или отказаться от использования SwingPanel и попробовать реализовать отсутствующий компонент, внеся вклад в развитие технологии.
Ниже приведены сценарии использования SwingPanel:
В приложении не нужны всплывающие окна, подсказки или контекстные меню либо, по крайней мере, они не находятся внутри вашего SwingPanel.
SwingPanel остаётся в фиксированном положении. В этом случае уменьшается риск сбоев и артефактов при изменении положения компонента Swing. Однако это условие не является обязательным, и его следует проверять в каждом конкретном случае.
Compose Multiplatform и Swing можно сочетать обоими способами, что позволяет гибко проектировать интерфейс. Можно разместить SwingPanel внутри ComposePanel, который, в свою очередь, может находиться внутри другого SwingPanel. Однако перед использованием таких вложенных комбинаций учитывайте возможность артефактов отображения. Пример кода см. в разделе Компоновка с вложенными компонентами SwingPanel и ComposePanel.
Использование Compose Multiplatform в приложении Swing
ComposePanel позволяет создавать интерфейс на Compose Multiplatform в приложении на Swing. Добавьте экземпляр ComposePanel в компоновку Swing и задайте композицию внутри setContent:
Экспериментальный режим позволяет отображать ComposePanel непосредственно на компонентах Swing. Это предотвращает проблемы с переходным отображением при появлении, скрытии или изменении размера ComposePanel. Кроме того, обеспечивается правильное наложение компонентов Swing и панелей Compose: компонент Swing можно отображать поверх или под ComposePanel. Однако по сравнению с рендерингом Skia по умолчанию это может снизить производительность, причём снижение будет тем заметнее, чем больше размер панели.
Этот режим влияет только на компоненты ComposePanel. На данный момент соответствующих настроек для ComposeWindow или ComposeDialog нет.
Чтобы включить внеэкранный рендеринг для определённого ComposePanel, передайте значение RenderSettings.SwingGraphics при его создании:
val composePanel = ComposePanel(renderSettings = RenderSettings.SwingGraphics)
Чтобы включить внеэкранный рендеринг по умолчанию для каждого ComposePanel в проекте, используйте флаг функции compose.swing.render.on.graphics:
Укажите флаг как аргумент JVM командной строки при запуске:
-Dcompose.swing.render.on.graphics=true
Или передайте флаг в качестве аргумента функции System.setProperty() в точке входа:
fun main() {
System.setProperty("compose.swing.render.on.graphics", "true")
...
}
Экспериментальные отдельные представления для всплывающих окон
Иногда важно, чтобы элементы всплывающих окон, например подсказки и раскрывающиеся меню, не были ограничены исходным холстом компонуемого элемента или окном приложения. Например, когда компонуемое представление не занимает весь экран, но должно открыть диалоговое окно предупреждения.
Чтобы создавать отдельные представления или окна для всплывающих окон на настольных платформах, задайте системное свойство compose.layers.type. Поддерживаются следующие значения:
WINDOW создаёт компоненты Popup и Dialog в отдельных окнах без оформления.
COMPONENT создаёт Popup или Dialog как отдельный компонент Swing в том же окне. Обратите внимание: для этого параметра необходимо включить внеэкранный рендеринг (см. раздел Экспериментальный внеэкранный рендеринг); внеэкранный рендеринг работает только для компонентов ComposePanel, но не для приложений с отдельными окнами.
Обратите внимание: всплывающие окна и диалоговые окна по-прежнему не могут рисовать за пределами собственных границ (например, тень верхнего контейнера).
Ниже приведён пример кода, использующего свойство COMPONENT:
Использование Swing в приложении Compose Multiplatform
SwingPanel позволяет создавать интерфейс Swing в приложении Compose Multiplatform. Используйте параметр factory функции SwingPanel, чтобы создать JPanel Swing:
Обновление компонентов Swing при изменении состояния Compose
Чтобы компонент Swing всегда содержал актуальные данные, передайте callback update: (T) -> Unit, который вызывается при каждом изменении состояния компонуемого элемента или создании его разметки. В следующем примере показано, как обновлять компонент Swing внутри SwingPanel при каждом изменении состояния компонуемого элемента:
По умолчанию представление для взаимодействия, реализованное с помощью обёртки SwingPanel, имеет прямоугольную форму и находится на переднем плане — поверх всех компонентов Compose Multiplatform. Чтобы упростить использование всплывающих элементов, мы добавили экспериментальную поддержку смешивания при взаимодействии.
Чтобы включить эту экспериментальную функцию, задайте системному свойству compose.interop.blending значение true. Свойство необходимо включить до выполнения любого кода Compose в приложении. Для этого задайте его с помощью аргумента JVM командной строки -Dcompose.interop.blending=true или используйте System.setProperty() в точке входа:
fun main() {
System.setProperty("compose.interop.blending", "true")
...
}
Если смешивание при взаимодействии включено, Swing можно использовать в следующих сценариях:
Обрезка. Теперь форма не ограничена прямоугольником: модификаторы clip и shadow корректно работают с SwingPanel.
Наложение. Поверх SwingPanel можно рисовать любое содержимое Compose Multiplatform и взаимодействовать с ним как обычно.
Компоновка с вложенными компонентами Swing и Compose Multiplatform
Благодаря взаимодействию можно сочетать Swing и Compose Multiplatform в обоих направлениях: добавлять компоненты Swing в приложение Compose Multiplatform и компоненты Compose Multiplatform в приложение Swing. Поддерживается также сценарий, в котором несколько компонентов вложены друг в друга, а подходы свободно комбинируются.
В следующем примере показано, как добавить SwingPanel в ComposePanel, уже находящийся внутри другого SwingPanel, создав структуру Swing — Compose Multiplatform — Swing: