Spec-Zone.ru › Kotlin 2

События клавиатуры

В Compose Multiplatform для настольных систем можно обрабатывать события клавиатуры, настраивая обработчики событий в двух разных областях видимости:

  • Обработчики событий, связанные с элементом в фокусе.

  • Обработчики событий в области видимости окна.

Примеры в этом руководстве — запускаемые настольные приложения. Чтобы попробовать один из них:

  1. Создайте проект Compose Multiplatform с помощью плагина Kotlin Multiplatform для IDE или онлайн-мастера.

  2. Откройте файл точки входа для настольного приложения. Например, desktopApp/src/main/kotlin/com/example/my_desktop_app/main.kt.

  3. Замените его содержимое приведённым примером.

События в компоненте в фокусе

В этом подходе нажатие клавиши запускает обработчики событий для компонента, находящегося в фокусе.

Обычно обработчики клавиатуры задают для активных элементов управления, таких как TextField. Чтобы перехватить событие клавиатуры до выполнения действия по умолчанию, можно использовать оба модификатора: onKeyEvent и onPreviewKeyEvent. Модификатор onKeyEvent позволяет обрабатывать отдельное нажатие клавиши, а onPreviewKeyEvent лучше подходит для определения сочетаний клавиш.

В следующем примере показано взаимодействие с TextField, в котором выполняются разные действия в зависимости от нажатой клавиши при удержании Ctrl. Добавьте этот код в файл main.kt в sharedUI/src/jvmMain/kotlin:

import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.material.TextField import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.isCtrlPressed import androidx.compose.ui.input.key.key import androidx.compose.ui.input.key.onPreviewKeyEvent import androidx.compose.ui.input.key.type import androidx.compose.ui.input.key.KeyEventType import androidx.compose.ui.window.singleWindowApplication fun main() = singleWindowApplication (title = "Key events") { MaterialTheme { var consumedText by remember { mutableStateOf(0) } var text by remember { mutableStateOf("") } Column(Modifier.fillMaxSize(), Arrangement.spacedBy(5.dp)) { Text("Consumed text: $consumedText") TextField( value = text, onValueChange = { text = it }, modifier = Modifier.onPreviewKeyEvent { when { (it.isCtrlPressed && it.key == Key.Minus && it.type == KeyEventType.KeyUp) -> { consumedText -= text.length text = "" true } (it.isCtrlPressed && it.key == Key.Equals && it.type == KeyEventType.KeyUp) -> { consumedText += text.length text = "" true } else -> false } } ) } } }
Keyboard events in a focused component

События в области видимости окна

Чтобы определить обработчики событий клавиатуры, всегда активные в текущем окне, используйте параметры onPreviewKeyEvent и onKeyEvent, доступные для функций Window, singleWindowApplication и Dialog. Они различаются способом отправки события, если оно не было обработано: onPreviewKeyEvent отправляет событие первому дочернему элементу, а onKeyEvent — родительскому элементу composable-функции. Обычно для перехвата событий предпочтителен onPreviewKeyEvent, поскольку он позволяет реализовать сочетания клавиш, действующие даже на всём экране.

В следующем примере показано взаимодействие с окном: закрытие всплывающего диалогового окна нажатием Escape и изменение содержимого окна нажатием сочетания клавиш Ctrl+Shift+C. Добавьте этот код в файл main.kt в sharedUI/src/jvmMain/kotlin:

import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material.Button import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.KeyEventType import androidx.compose.ui.input.key.isCtrlPressed import androidx.compose.ui.input.key.isShiftPressed import androidx.compose.ui.input.key.key import androidx.compose.ui.input.key.type import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogWindow import androidx.compose.ui.window.singleWindowApplication private var cleared by mutableStateOf(false) fun main() = singleWindowApplication( title = "Keyboard events", onKeyEvent = { if ( it.isCtrlPressed && it.isShiftPressed && it.key == Key.C && it.type == KeyEventType.KeyDown ) { cleared = true true } else { false } } ) { MaterialTheme { if (cleared) { Text("The App was cleared!") } else { App() } } } @Composable fun App() { var isDialogOpen by remember { mutableStateOf(false) } if (isDialogOpen) { DialogWindow(onCloseRequest = { isDialogOpen = false }, title = "Dialog", onPreviewKeyEvent = { if (it.key == Key.Escape && it.type == KeyEventType.KeyDown) { isDialogOpen = false true } else { false } }) { Text("Hello!") } } Column(Modifier.fillMaxSize(), Arrangement.spacedBy(5.dp)) { Button( modifier = Modifier.padding(4.dp), onClick = { isDialogOpen = true } ) { Text("Open dialog") } } }
Keyboard events in a window scope

Что дальше?

  • Подробности см. в справочнике API.

  • Изучите руководства по другим компонентам для настольных систем.

21 мая 2026 г.
Обработчики событий мышиНавигация клавишей Tab и фокус клавиатуры

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/compose-desktop-keyboard.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API