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)
}
}
}
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)
}
}
}