在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):edvin/tornadofx开源软件地址(OpenSource Url):https://github.com/edvin/tornadofx开源编程语言(OpenSource Language):Kotlin 99.3%开源软件介绍(OpenSource Introduction):TornadoFXJavaFX Framework for Kotlin Important: TornadoFX is not yet compatible with Java 9/10 Oracle is intending to decouple JavaFX from the JDK. We will wait until the decoupled JavaFX is available and stable before upgrading TornadoFX to support it. As of now there is little value and significant effort involved in updating to JDK 9/10, while there will be an enormous value in updating to the decoupled version. Features
Important version noteTornadoFX requires Kotlin 1.1.2 and jvmTarget 1.8. Make sure you update your IDE plugins (Kotlin + TornadoFX). After updating IntelliJ IDEA, make sure your Kotlin target version is 1.1 (Project Settings -> Modules -> Kotlin -> Language Version / API Version) Remember to update your build system to configure the For Maven, you add the following configuration block to <configuration>
<jvmTarget>1.8</jvmTarget>
</configuration> For Gradle, it means configuring the compileKotlin {
kotlinOptions.jvmTarget= "1.8"
} Failing to do so will yield errors about the compiler not being able to inline certain calls. You also need a full rebuild of your code after a version upgrade. If you run into trouble, try to clean caches and restart IDEA (File -> Invalidate caches / Restart). Getting started
Generate a quickstart application with Mavenmvn archetype:generate -DarchetypeGroupId=no.tornado \
-DarchetypeArtifactId=tornadofx-quickstart-archetype \
-DarchetypeVersion=1.7.20 Add TornadoFX to your projectMaven<dependency>
<groupId>no.tornado</groupId>
<artifactId>tornadofx</artifactId>
<version>1.7.20</version>
</dependency> Gradleimplementation 'no.tornado:tornadofx:1.7.20' Snapshots are published to SonatypeConfigure your build environment to use snapshots if you want to try out the latest features: <repositories>
<repository>
<id>snapshots-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories> Snapshots are published every day at GMT 16:00 if there has been any changes. What does it look like? (Code snippets)Create a View class HelloWorld : View() {
override val root = hbox {
label("Hello world")
}
} Start your application and show the primary import javafx.scene.text.FontWeight
import tornadofx.*
class HelloWorldApp : App(HelloWorld::class, Styles::class)
class Styles : Stylesheet() {
init {
label {
fontSize = 20.px
fontWeight = FontWeight.BOLD
backgroundColor += c("#cecece")
}
}
}
Use Type Safe Builders to quickly create complex user interfaces class MyView : View() {
private val persons = FXCollections.observableArrayList(
Person(1, "Samantha Stuart", LocalDate.of(1981,12,4)),
Person(2, "Tom Marks", LocalDate.of(2001,1,23)),
Person(3, "Stuart Gills", LocalDate.of(1989,5,23)),
Person(3, "Nicole Williams", LocalDate.of(1998,8,11))
)
override val root = tableview(persons) {
column("ID", Person::id)
column("Name", Person::name)
column("Birthday", Person::birthday)
column("Age", Person::age)
columnResizePolicy = SmartResize.POLICY
}
} RENDERED UI Create a Customer model object that can be converted to and from JSON and exposes both a JavaFX Property and getter/setter pairs: import tornadofx.getValue
import tornadofx.setValue
class Customer : JsonModel {
val idProperty = SimpleIntegerProperty()
var id by idProperty
val nameProperty = SimpleStringProperty()
var name by nameProperty
override fun updateModel(json: JsonObject) {
with(json) {
id = int("id") ?: 0
name = string("name")
}
}
override fun toJSON(json: JsonBuilder) {
with(json) {
add("id", id)
add("name", name)
}
}
} Create a controller which downloads a JSON list of customers with the REST api: class HelloWorldController : Controller() {
val api : Rest by inject()
fun loadCustomers(): ObservableList<Customer> =
api.get("customers").list().toModel()
} Configure the REST API with a base URI and Basic Authentication: with (api) {
baseURI = "http://contoso.com/api"
setBasicAuth("user", "secret")
} Load customers in the background and update a TableView on the UI thread: runAsync {
controller.loadCustomers()
} ui {
customerTable.items = it
} Load customers and apply to table declaratively: customerTable.asyncItems { controller.loadCustomers() } Define a type safe CSS stylesheet: class Styles : Stylesheet() {
companion object {
// Define css classes
val heading by cssclass()
// Define colors
val mainColor = c("#bdbd22")
}
init {
heading {
textFill = mainColor
fontSize = 20.px
fontWeight = BOLD
}
button {
padding = box(10.px, 20.px)
fontWeight = BOLD
}
val flat = mixin {
backgroundInsets += box(0.px)
borderColor += box(Color.DARKGRAY)
}
s(button, textInput) {
+flat
}
}
} Create an HBox with a Label and a TextField with type safe builders: hbox {
label("Hello world") {
addClass(heading)
}
textfield {
promptText = "Enter your name"
}
} Get and set per component configuration settings: // set prefWidth from setting or default to 200.0
node.prefWidth(config.double("width", 200.0))
// set username and age, then save
with (config) {
set("username", "john")
set("age", 30)
save()
} Create a class MyFragment : Fragment() {
override val root = hbox {
}
} Open it in a Modal Window: find<MyFragment>().openModal() Lookup and embed a add<MyFragment>() Inject a val myView: MyView by inject()
init {
root.add(myFragment)
} Swap a View for another (change Scene root or embedded View) button("Go to next page") {
action {
replaceWith<PageTwo>(ViewTransition.Slide(0.3.seconds, Direction.LEFT)
}
} Open a View in an internal window over the current scene graph button("Open") {
action {
openInternalWindow<MyOtherView>()
}
} |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论