Добро пожаловать в 5. напишите о моем путешествии по преобразованию приложения Java Swing для создания для рабочего стола. Сегодня я сосредоточусь на строках меню и светлых и темных цветах. Строки меню являются жизненно важной метафорой пользовательского интерфейса в настольных операционных системах, поэтому очень хорошо иметь поддержку для них и в Compose Desktop. Как вы вскоре увидите, в данный момент это может быть немного ограничено. Имейте в виду, однако, что в настоящее время Compose для рабочего стола находится в режиме предварительного просмотра.
Чтобы утолить ваш аппетит, пожалуйста, взгляните на этот клип:
Давайте посмотрим, как выбрать светлые или темные цвета.
private fun colors(): Colors = if (isInDarkMode) { darkColors() } else { lightColors() }
Оба темные цвета()
и светлые цвета()
принадлежат android.composite.материалу.Цвета.кт
. находится в темном режиме
это переменная, которую я определил так:
private var isInDarkMode: Boolean by observable(true /* isSystemInDarkTheme() */) { _, oldValue, newValue -> onIsInDarkModeChanged?.let { it(oldValue, newValue) } } private var onIsInDarkModeChanged: ((Boolean, Boolean) -> Unit)? = null
Jetpack Compose на Android позволяет нам проверить, находится ли система в данный момент в темном режиме с является ли система в темной теме()
но в настоящее время это не поддерживается в Compose Desktop. По этому поводу есть запрос функции . Пожалуйста, подумайте о том, чтобы проголосовать за это.
Как вы можете видеть, находится В Темном Режиме
является наблюдаемым. Когда его значение меняется, я вызываю вкл. В Темном Режиме Изменен
если это не null
. Да, это выглядит странно. Почему я не вспомнил
это внутри составного? Вот как настроена строка меню. Обратите внимание, что это делается до Окно приложения
вступает в игру.
AppManager.setMenu( MenuBar(Menu("Appearance", MenuItem( name = if (isInDarkMode) "Light Mode" else "Dark Mode", onClick = { isInDarkMode = !isInDarkMode }, shortcut = KeyStroke(Key.L) ))) ) AppWindow(title = "TKDupeFinder", size = IntSize(600, 400)).show { TKDupeFinderContent() }
Оба Меню
и Строка меню
в настоящее время являются классами, а не компостируемыми. Чтобы получить глобальную строку меню, вам нужно настроить ее с помощью App Manager.setMenu()
. Когда создается новое Окно приложения
, оно наследует строку глобального меню. Итак, если вы впоследствии измените строку меню, то Окно приложения
((то есть его строка меню) не будет затронута. Следовательно, мой код
name = if (isInDarkMode) "Light Mode" else "Dark Mode",
не имеет смысла, так как оно выполняется только один раз. Это так, потому что я написал это до того, как узнал то, что только что сказал вам. 😂
Я думаю, чтобы иметь возможность менять меню, они должны быть компостируемыми. И изменения в глобальной строке меню необходимо будет распространить на строки меню внутри окон. Возможно, я не смогу изменить меню, но, очевидно, переключение цветов действительно работает. Как это так? Помните об этом
onClick = { isInDarkMode = !isInDarkMode },
вызовет обратный вызов от моего наблюдаемого, как только он будет установлен. Я делаю это вот так:
@Composable fun TKDupeFinderContent() { var colors by remember { mutableStateOf(colors()) } onIsInDarkModeChanged = { _, _ -> colors = colors() }
Таким образом, составной объект может реагировать на изменения переменных, которые определены снаружи. В заключение давайте резюмируем выводы:
- В настоящее время меню и строки меню, похоже, не являются компостируемыми
- В настоящее время изменение строк меню может быть затруднено
Я что-то пропустил? Пожалуйста, поделитесь своими выводами, идеями и предложениями в комментариях.
От качания до реактивного пакета Создайте рабочий стол #1 От качания до реактивного пакета Создайте рабочий стол #2 От качания до создания рабочего стола #3 От качания до создания рабочего стола # 4
Оригинал: “https://dev.to/tkuenneth/from-swing-to-compose-desktop-5-4ehc”