JVM 데스크톱 프레임워크의 현황: TornadFX
JavaFX
JavaFX는 처음에 JavaFX script이라는 스크립트 언어였다.Microsystems는 Adobe Flex(현재 Apache Flex)와 Microsoft Silverlight과 경쟁할 계획이지만 경쟁 정도는 낮다.
2010년 자바원에서는 썬을 인수한 오라클이 이 언어 개발을 중단하고 API를 보류하겠다고 발표했다.2014년 발표된 자바8에 따라 자바FX는 스윙API의 정식 계승자가 되었다. 후자는 그때부터 오류를 복구받았다.
In the past JavaFX was included in the Oracle JDK up till version 11.
But it has always been a separate project and can also be installed separately from the JDK.
JavaFX는 스윙에 비해 추상적인 어플리케이션을 추가했습니다.다음은 JavaFXAPI의 개요입니다.
또한 두 가지 방법으로 JavaFX 사용자 인터페이스를 생성할 수 있습니다.
다음은 동일한 애플리케이션의 the former 및 the latter 예입니다.
토네이도 외환
Kotlin은 Java API를 개선하여 개발자 경험을 향상시킬 수 있습니다.우리는 스스로 할 수 있다.그러나 Tornado FX 프로젝트는 이미 이 문제를 해결했다.
다음은 API 공중도입니다.
Tornado FX는 일반 JavaFX에 비해 몇 가지 장점이 있습니다.여기 좀 있습니다.
구성 요소 및 레이아웃 DSL
Groovy와 마찬가지로 Kotlin은 사용 가능한 DSL을 만들 수 있습니다.Groovy와 달리 기본적으로 만들어진 DSL은 유형이 안전합니다.너는 내가 전에 DSL에 관한 두 가지 실험을 찾을 수 있다.
Kaadin, Vaadin
An embryo of a DSL 구성 Hazelcast
vbox {
text("Name")
textfield()
button("Button").setOnAction {
println("Button pressed")
}
}
일부 레이아웃은 더 복잡한 설정을 허용한다.예를 들어 JavaFX는 GridPane
의 레이아웃을 제공했고 AWT의 GridbagLayout
과 유사하다.각 레이아웃 요소에 대해 구성을 GridPaneContraints
객체로 전달해야 합니다.다음은 예입니다.override val root = gridpane {
padding = insets(space)
textfield {
gridpaneConstraints {
columnIndex = 0
fillWidth = true
hGrow = Priority.ALWAYS
marginBottom = space
}
}
button("Button") {
gridpaneConstraints {
columnIndex = 1
hAlignment = HPos.RIGHT
marginBottom = space
}
}
textfield {
gridpaneConstraints {
rowIndex = 1
fillWidth = true
hGrow = Priority.ALWAYS
}
}
textfield {
gridpaneConstraints {
columnRowIndex(1, 1)
fillWidth = true
hGrow = Priority.ALWAYS
marginLeft = space
}
}
}
읽을 수 없을 것 같지만 IDE가 큰 도움을 줄 수 있습니다.IntelliJ IDEA를 사용하여 중요하지 않은 부분을 축소할 수 있습니다.나는 실례화할 때 설정한 일반 클래스가 아니라 가능한 한 모든 구성 요소에 전용 클래스를 만드는 경향이 있다.그것은 기존의 DSL과 잘 어울리지 않는다. 왜냐하면 나는 자신의 DSL로 그것을 보충해야 하기 때문이다.
컨트롤러
Tornado FX의 컨트롤러는 MVC pattern의 C 부분을 구현했습니다.그들은 봉인 업무 논리를 책임진다.UI 스레드는 응답하지 않기 때문에 장시간 실행되는 작업을 실행하지 않아야 합니다.관제사가 이런 임무를 수행할 수 있기 때문에 당신은 구체적인 상황에 따라 결정해야 합니다.마지막으로 컨트롤러 (링크: # 의존 주입 [다음 참조]) 를 다른 구성 요소에 단일 예로 주입할 수 있습니다.
API가 어떠한 요구사항도 강제로 집행하지 않았다는 것은 아니다.개발자가 상술한 지침에 따라 컨트롤러를 설계하다.
예를 들어, 다음 컨트롤러는 다른 유형의 이벤트를 수신할 때 이벤트를 트리거합니다.
class PathModelController : Controller() {
init {
subscribe<DirectoryPathUpdatedEvent> {
fire(PathModelUpdatedEvent(it.path))
}
}
}
Tornado FX의 컨트롤러는 뷰에 주입할 수 있습니다.이런 방법은 관점과 논리를 결합시킨다.나는 차라리 보기를 컨트롤러에 주입하는 방식을 바꾸고 싶다.따라서 UI 구성 요소를 다른 논리로 재사용할 수 있습니다.기존 설계에서는 UI 구성 요소별로 동일한 논리를 재사용할 수 있으므로 훨씬 적습니다.의존 주입
Tornado FX는 종속 주입을 제공합니다.API는 두 가지 종속성 주입 방법을 제공합니다.
inject()
대표:class MyView: View("My View") {
val myController: MyController by inject()
val myController2 by inject<MyController>()
}
명시적으로
find()
함수를 호출합니다.class MyView: View("My View") {
val myController = find(MyController::class)
val myController2 = find<MyController>()
}
inject()
은 View
과 Controller
에서 사용할 수 있지만 다른 클래스에서는 find()
을 사용해야 합니다.액티브 버스
TornadFX는 단일 범위의 이벤트 버스를 제공합니다.그것의 용법은 매우 고전적이다.
이벤트 클래스는 반드시
FXEvent
초클래스에서 계승해야 한다.TornadFX는 애플리케이션 스레드든 백그라운드 스레드든 이벤트를 관리하는 스레드를 설정해야 합니다.장시간 운행하는 임무는 백엔드 라인에서 운행해야 한다.Component
은 fire()
함수를 제공하여 사건을 버스로 전송한다.또한 받은 이벤트를 알려주고 유형별로 필터링하는 register()
기능을 제공합니다.그 모양은 다음과 같습니다.
class FooEvent: FXEvent(BackgroundThread)
class BarEvent: FXEvent(BackgroundThread)
class Dummy {
init {
subscribe<FooEvent> {
println(it) // 1
}
}
fun bar() {
fire(BarEvent()) // 2
}
}
이벤트 버스가 FooEvent
으로 수신되면 BarEvent
결론
간단한 프레젠테이션 앱을 개발한 후에 저는 자바 FX도 Tornado FX에 대해 의견을 발표할 수 없습니다.더 많은 경험이 필요하다.내장형 이벤트 버스는 좋아하지만 컨트롤러와 UI 구성 요소 간의 관계 설계는 좋아하지 않습니다.
서문에서 언급한 바와 같이 스윙은 모든 상황에서 업데이트되지 않는다.JavaFX는 사용자가 좋아하든 안 좋아하든 옵션의 일부입니다.
이 글에 대한 그들의 평론에 감사하고 감사하다.
이 기사의 전체 소스 코드는 GitHub에서 확인할 수 있습니다.
아자바지크 / 토네이도
한 걸음 더 나아가 말하면:
Reference
이 문제에 관하여(JVM 데스크톱 프레임워크의 현황: TornadFX), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nfrankel/the-state-of-jvm-desktop-frameworks-tornadofx-d6m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)