Swing에서 Jetpack Compose 데스크탑까지 #1
내 여정을 따라와.
내가 변형할 앱은 아주 오래되었습니다. TKDupeFinder라고 합니다. 유일한 목적은 중복 파일을 찾는 것입니다. 사용자가 기본 디렉토리에 들어가면 앱은 모든 하위 폴더를 탐색하고 동일한 MD5 해시가 있는 파일을 검색합니다. 목록에 표시됩니다. 그런 다음 사용자는 이러한 파일을 열고 중복 파일을 삭제할 수 있습니다. 10년 이상 동안 이 앱은 내 하드 드라이브 깊숙이 파묻혀 있었습니다. 며칠 전에 repo on GitHub을 만들고 소스를 푸시했습니다. 여기서 변형이 일어날 것입니다.
첫 번째 단계는 소스 코드를 Kotlin 지원으로 만드는 것입니다. 원래 앱은 NetBeans를 사용하고 Maven을 활용하여 Java로 작성되었습니다. 아직 NetBeans용 Kotlin 플러그인이 있지만 더 이상 적극적으로 개발되지 않는 것 같습니다. 그래서 프로젝트를 IntelliJ로 옮기기로 결정했습니다. 저도 Gradle로 바꿨습니다. Kotlin을 Maven과 함께 쉽게 사용할 수 있지만 현재 데스크톱용 Jetpack Compose 초기 미리보기 문서는 Gradle에 중점을 둡니다. Swing 애플리케이션을 시작하는 Kotlin
main()
함수를 작성해 보겠습니다.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
}
}
나쁘지는 않지만 우리가 더 추구하고 싶은 것은 아닙니다. 우리는 UI를 합성하고 싶습니다. 맞습니까? 이 와이어프레임을 살펴보십시오.
따라서 버튼, 레이블, 목록 및 텍스트 필드가 필요합니다. 다음은 연결 방법입니다.
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에서는 다음과 같이 표시됩니다.
이제 이것은 매우 대략적인 컷일뿐입니다. 그러나 우리는 그것에 노력할 것입니다. 계속 지켜봐주십시오.
Reference
이 문제에 관하여(Swing에서 Jetpack Compose 데스크탑까지 #1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tkuenneth/from-swing-to-jetpack-compose-desktop-1-12kf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)