Рубрики
Без рубрики

От качания до реактивного ранца Создайте рабочий стол #1

Недавно JetBrains анонсировала предварительную версию Jetpack Compose для настольных компьютеров. Как и в случае с реактивным ранцем… Помеченный как kotlin, java.

Недавно JetBrains анонсировала предварительную версию Jetpack Compose для настольных компьютеров . Поскольку Jetpack Compose – это следующая важная вещь в пользовательском интерфейсе Android и у меня всегда была страсть к рабочему столу, я чувствовал, что просто должен знать, как выглядит и ощущается Compose for Desktop. Лучший способ узнать что-то новое – это использовать его и играть с ним. Поэтому я решил попробовать преобразовать пользовательский интерфейс Java Swing в Compose Desktop.

Следуйте за мной в моем путешествии.

Приложение, которое я буду преобразовывать, старое, очень старое. Он называется TKDupeFinder . Его единственная цель – найти дубликаты файлов. Как только пользователь вводит базовый каталог, приложение просматривает все дочерние папки и выполняет поиск файлов с одинаковым хэшем MD5. Они отображаются в виде списка. Затем пользователь может открыть эти файлы и удалить дубликаты. Более десяти лет приложение было похоронено в глубинах моего жесткого диска. Пару дней назад я создал репозиторий на GitHub и нажал на исходный код. Именно здесь произойдет трансформация.

Первый шаг – сделать исходный код Kotlin готовым. Первоначально приложение было написано на Java с использованием NetBeans и Maven. Хотя для NetBeans все еще существует плагин Kotlin, он, похоже, больше не разрабатывается активно. Поэтому я решил перенести проект в IntelliJ. Я также переключился на Gradle. В то время как вы можете легко использовать Kotlin с Maven, текущая документация Jetpack Compose для предварительного просмотра на рабочем столе сосредоточена на Gradle. Давайте напишем Kotlin main() -функцию, которая запускает приложение Swing:

package com.thomaskuenneth.tkdupefinder

import javax.swing.SwingUtilities
import javax.swing.UIManager
import javax.swing.UnsupportedLookAndFeelException

fun main() {
    SwingUtilities.invokeLater {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
        } catch (thr: ClassNotFoundException) {
            System.err.println(thr.localizedMessage)
        } catch (thr: InstantiationException) {
            System.err.println(thr.localizedMessage)
        } catch (thr: IllegalAccessException) {
            System.err.println(thr.localizedMessage)
        } catch (thr: UnsupportedLookAndFeelException) {
            System.err.println(thr.localizedMessage)
        }
        TKDupeFinderGUI().isVisible = true
    }
}

Неплохо, но это не то, чем мы хотим заниматься дальше, мы хотим создать пользовательский интерфейс, верно? Взгляните на этот каркас:

Итак, нам нужны несколько кнопок, метка, список и текстовое поле. Вот как мы могли бы все организовать.

package com.thomaskuenneth.tkdupefinder

import androidx.compose.desktop.Window
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.LastBaseline
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp

fun main() = Window(title = "TKDupeFinder", size = IntSize(600, 400)) {
    MaterialTheme {
        Column() {
            FirstRow()
            SecondRow()
            ThirdRow()
        }
    }
}

@Composable
fun FirstRow() {
    val name = remember { mutableStateOf(TextFieldValue("")) }
    Row(
            modifier = Modifier.fillMaxWidth()
                    .padding(8.dp),
    ) {
        TextField(
                value = name.value,
                placeholder = {
                    Text("Base directory")
                },
                modifier = Modifier.alignBy(LastBaseline)
                        .weight(1.0f),
                onValueChange = {
                    name.value = it
                },
        )
        MySpacer()
        Button(
                onClick = {},
                modifier = Modifier.alignByBaseline(),
        ) {
            Text("Find")
        }
    }
}

@Composable
fun SecondRow() {
    Row(
            verticalAlignment = Alignment.CenterVertically,
            modifier = Modifier.fillMaxWidth()
                    .padding(8.dp),
    ) {
        Button(onClick = {}) {
            Text("\u140A")
        }
        MySpacer()
        Button(onClick = {}) {
            Text("\u1405")
        }
        MySpacer()
        Text(text = "1 of 42")
    }
}

@Composable
fun MySpacer() {
    Spacer(modifier = Modifier.width(8.dp))
}

@Composable
fun ThirdRow() {
    val scrollState = rememberScrollState()
    ScrollableColumn(
            scrollState = scrollState,
            modifier = Modifier.fillMaxSize().padding(8.dp),
    ) {
        Text("1")
        Text("2")
        Text("3")
    }
}

На macOS это выглядит следующим образом:

Так вот, это наверняка всего лишь очень грубый срез. Но мы будем работать над этим. Так что следите за обновлениями.

Оригинал: “https://dev.to/tkuenneth/from-swing-to-jetpack-compose-desktop-1-12kf”