Добро пожаловать в 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”