Compose desktop(JVM) BasicTextField, дублирование ввода на корейском языке

Я реализую простое поле ввода поиска на рабочем столе Compose.

Мой код выглядит так, как показано ниже.

                  BasicTextField(
                modifier = Modifier.align(Alignment.CenterVertically).onPreviewKeyEvent {
                     if(it.key == Key.Enter && it.type == KeyEventType.KeyDown){
                        println("enter down: $textFieldState")
                        true
                    }else {
                         false
                    }
                },
                value = textFieldState,
                onValueChange = { input ->
                    textFieldState = input
                },
                textStyle = TextStyle(
                    fontSize = 14.sp,
                    textAlign = TextAlign.Start,
                    fontWeight = FontWeight.Normal,
                    fontFamily = NotoSans,
                    color = Color.Black
                ),
                maxLines = 1,
                decorationBox = { innerTextField ->
                    Row(modifier = Modifier.fillMaxWidth()) {
                        if (textFieldState.isEmpty()) {
                            Text(
                                text = "Search with user name.",
                                fontSize = 14.sp,
                                color = Color(0xFF909ba9),
                                textAlign = TextAlign.Start,
                                fontWeight = FontWeight.Normal,
                                fontFamily = NotoSans,
                                modifier = Modifier.fillMaxWidth()
                                    .align(Alignment.CenterVertically),
                            )
                        }
                    }
                    innerTextField()
                }
            )

Этот код создаст текстовое поле с 1 максимальной строкой. Он работает без каких-либо проблем на английском языке. Но когда я ввожу корейский ввод, такие клавиши, как пробел, ввод или даже цифры, будут дублировать последний корейский символ. Например, на английском языке, если я наберу H, I, !, это будет HII!.

Есть ли какие-то настройки локали, которые можно сделать для текстового поля?

1 ответ

Я не нашел рабочего решения здесь или на странице проблемы многоплатформенного git Compose. Я нашел обходной путь, используя SwingPanel и JTextField.

      SwingPanel(background = Color(0xFFf5f6f6), modifier = Modifier.fillMaxSize(), factory = {
                //Some JTextfield I've obtaines from stackoverflow to show place holder text.
                //Can be replaced to JTextField(columnCount:Int)
                HintTextField("Enter in name",1).apply {
                    background = java.awt.Color(0xf5, 0xf6, 0xf6)
                    border = null
                }
            }, update = {
                //SimpleDocumentListener is an implementation of DocumentListener.
                //Which means it can be replaced by it.
                it.document.addDocumentListener(object : SimpleDocumentListener{
                    override fun update(e: DocumentEvent) {
                        try{
                            val text = it.text
                            textFieldState = text
                        } catch(e : Exception) {
                            e.printStackTrace()
                        }
                    }
                })
                //I need an enter key to trigger some search logics.
                //textFieldState seems to print the value as I intended
                it.addKeyListener(object : KeyAdapter(){
                    override fun keyPressed(e: KeyEvent?) {
                        if(e?.keyCode == KeyEvent.VK_ENTER){
                            println("ENTER : $textFieldState")
                        }
                    }
                })
            })

Очень надеюсь, что мультиплатформенная команда compose предложит лучшее решение.

Другие вопросы по тегам