[출처 - 이 글은 tornadofx-guide르 통해 공부한 내용을 정리한 글입니다. 더 정확한 내용은 https://edvin.gitbooks.io/tornadofx-guide/part1/3.%20Components.html 에서 확인 하실 수 있습니다.]
소프트 웨어 디자인 패턴중에 MVC라는 패턴이 존재합니다.
Model - 핵심 논리 및 데이터를 보유하는 비즈니스 코드 계층
View - 다양한 입력 및 출력 컨트롤이있는 시각적 디스플레이
Controller - 모델과 뷰 사이의 "중개자"매개 이벤트
TornadoFx에서 Controller는 View를 지원합니다. 그럼 다음 code를 통하여 확인 해보도록 하겠습니다.
import javafx.beans.property.SimpleStringProperty
import tornadofx.*
class CView : View(){
val controller : MyController by inject<MyController>()
val input = SimpleStringProperty()
override val root = form {
fieldset {
field ("Input"){
textfield (input)
}
button("Commit") {
action {
controller.writeToDb(input.value)
input.value = ""
}
}
}
}
}
class MyController: Controller() {
fun writeToDb(inputValue: String) {
println("Writing $inputValue to database!")
}
}
class CApp : App(CView::class)
fun main() {
launch<CApp>()
}
위 코드는 textfield에 글자를 입력하고 commit button을 누르면 controller의 writeToDb가 동작하여 입력된 글자를 console로 출력합니다. (DB라고는 했지만 사실 DB 작업은 하지 않았습니다. 만일 정말 DB가 필요할 경우 writeToDb에 DB 작업을 하면 됩니다.)
결과를 보면
입력 후 Commit을 누르면
이렇게 Console에 문장이 나타나고 입력 창은 빈 창이 됩니다.
그리고 Controller를 만들어서 listview에 나타낼 item들을 나열 할 수 있습니다.
class FxMyView : View(){
val controller: FxMyController by inject()
override val root = vbox {
label("My items")
listview(controller.values)
}
}
class FxMyController: Controller() {
val values = FXCollections.observableArrayList("Alpha","Beta","Gamma","Delta")
}
class FxApp : App(FxMyView :: class)
fun main() {
launch<FxApp>()
}
그 결과는
사실 controller를 안 만들고 쓸 수 있지만, controller를 만듬으로 써 code가 좀더 보기 좋아지고 정리되어 보수에도 유용합니다.
또한, code 작업을 하다보면 funtion으로 부터 결과값을 바로 전달 받거나, long task 가 완료된 후 전달 받는 경우가 발생합니다. 만일, 사용자가 어떤 동작을 요청했는데 그 동작 관련 function이 long task funtion일 경우, 이 task가 끝날 때까지 응답을 하지않게 될 것 입니다. 이런 일이 없도록 long task 동작은 background에서 동작하도록 작업을 해야할 것이고, 이런 부분에 대해서 TornadoFx는 runAsync 를 제공하고 있습니다. ( 이부분은 guide를 읽고 제가 나름 생각하여 작성한 부분입니다. 확실하지 않을 수 있기 때문에 가이드에서 쫌더 확실한 정보를 확인하시실 당부 드립니다. - https://edvin.gitbooks.io/tornadofx-guide/part1/3.%20Components.html 에 Long Running Tasks 부분 입니다.)
예제 code를 보면
import javafx.beans.property.SimpleStringProperty
import tornadofx.*
val input = SimpleStringProperty()
class runAsyncView : View() {
val myController: asyncMyController by inject<asyncMyController>()
var loadedText: String = "aaaa"
override val root = vbox {
val textfield = textfield(input)
val actionlabel = label()
button("Update text") {
action {
runAsync {
loadedText = myController.loadText()
} ui {
actionlabel.text = loadedText
}
}
}
}
}
class asynApp : App(runAsyncView::class)
class asyncMyController : Controller() {
fun loadText(): String {
return input.value
}
}
fun main() {
launch<asynApp>()
}
runAsync 블럭 안에 배치된 code는 백그라운드에서 동작을 하고 그 결과를 ui 블럭에 적용하여 UI를 업데이트 합니다.
위 code를 실행하면
위와 같이 textfield에 입력된 문자가 button과 textfield 사이에 적용됩니다.
'2023년 이전 > kotlin-TornadoFx' 카테고리의 다른 글
TornadoFx - replaceView , passParameter (0) | 2019.10.07 |
---|---|
TornadoFx - Fragment (0) | 2019.10.07 |
TornadoFX - View 적용 (0) | 2019.10.07 |
TornadoFX 동작시키기 (0) | 2019.10.07 |
TornadoFX를 사용하여 GUI 띄우기 (0) | 2019.08.30 |