PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [JavaFX] Application Property



lrg0
01.11.2017, 19:04
Hi,

ich stehe mal wieder etwas auf dem Schlauch...

In meiner Klasse MyApp : App() habe ich ein SimpleStringProperty auf das ich es jetzt aus meiner View zugreifen will. Ich weiss aber nicht, wie ich an die Eigenschaft komme.
Hab es jetzt über Reflection probiert aber es klappt nicht.

app:


package app.app

import app.view.MainView
import javafx.beans.property.SimpleStringProperty
import tornadofx.App

class MyApp: App(MainView::class, Styles::class){
var appProperty = SimpleStringProperty("123")
}

mainview:


package app.view

import javafx.scene.control.Alert
import tornadofx.*

class MainView : View("Hello TornadoFX") {

override val root = borderpane{
left = vbox{
label ("one") {
onDoubleClick { alert(Alert.AlertType.INFORMATION, "Double Click") }
}
label ("two")
label ("three")
}
center(SecondView::class)
}
}



secondview: hier will ich die Eigenschaft lesen


package app.view

import app.app.Styles
import app.app.MyApp
import javafx.beans.property.SimpleStringProperty
import tornadofx.*

class SecondView : View ("Second View"){
override val root = vbox {
label{
bind(app.getProperty(MyApp::appProperty)) // Runtime Exception
addClass(Styles.heading)
}
}
}


Exception:


Nov 01, 2017 6:58:31 PM tornadofx.DefaultErrorHandler uncaughtException
SCHWERWIEGEND: Uncaught error
java.lang.IllegalArgumentException: No delegate field with name 'appProperty' found
at tornadofx.PropertiesKt.getProperty(Properties.kt:3 8)
at app.view.SecondView$root$1$1.invoke(SecondView.kt: 11)
at app.view.SecondView$root$1$1.invoke(SecondView.kt: 8)
at tornadofx.FXKt.opcr(FX.kt:436)
at tornadofx.ControlsKt.label(Controls.kt:401)
at tornadofx.ControlsKt.label$default(Controls.kt:398 )
at app.view.SecondView$root$1.invoke(SecondView.kt:10 )
at app.view.SecondView$root$1.invoke(SecondView.kt:8)
at tornadofx.FXKt.opcr(FX.kt:436)
at tornadofx.LayoutsKt.vbox(Layouts.kt:107)
at tornadofx.LayoutsKt.vbox$default(Layouts.kt:103)
at app.view.SecondView.<init>(SecondView.kt:9)
at sun.reflect.NativeConstructorAccessorImpl.newInsta nce0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInsta nce(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newI nstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Construc tor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at tornadofx.FXKt.find(FX.kt:401)
at tornadofx.FXKt.find$default(FX.kt:387)
at tornadofx.LayoutsKt.setRegion(Layouts.kt:150)
at tornadofx.UIComponent.center(Component.kt:635)
at app.view.MainView$root$1.invoke(MainView.kt:21)
at app.view.MainView$root$1.invoke(MainView.kt:10)
at tornadofx.FXKt.opcr(FX.kt:436)
at tornadofx.LayoutsKt.borderpane(Layouts.kt:125)
at app.view.MainView.<init>(MainView.kt:12)
at sun.reflect.NativeConstructorAccessorImpl.newInsta nce0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInsta nce(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newI nstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Construc tor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at tornadofx.FXKt.find(FX.kt:401)
at tornadofx.FXKt.find$default(FX.kt:387)
at tornadofx.App.start(App.kt:79)
at com.sun.javafx.application.LauncherImpl.lambda$lau nchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$run AndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$nul l$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$run Later$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run( InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Nativ e Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$14 8(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)


Lang: Kotlin
Lib: TornadoFX
IDE: Intellij Idea
OS: Windows 10

---------- Post added at 20:04 ---------- Previous post was at 19:25 ----------

ich habe es geschafft... es funktioniert jetzt. ich habe es zwar noch nicht verstanden aber es funktioniert.

Der Vollständigkeit halber hier die Lösung:

app:


package app.app

import app.view.MainView
import tornadofx.*

class MyApp: App(MainView::class, Styles::class){
var myString by property("123")
}

mainview:


package app.view

import app.app.MyApp
import tornadofx.*

class MainView : View("Hello TornadoFX") {

override val root = borderpane{
left = vbox{
label ("one") {
onDoubleClick {
app.getProperty(MyApp::myString).set("one")
}
}
label ("two"){
onDoubleClick { println(app.getProperty(MyApp::myString)) }
}
label ("three")
}

center(SecondView::class)
}
}

secondview:


package app.view

import app.app.Styles
import app.app.MyApp
import tornadofx.*

class SecondView : View ("Second View"){
override val root = vbox {
label ("12345678"){
bind(app.getProperty(MyApp::myString))
addClass(Styles.heading)
}
}
}