java.lang.NoSuchMethodException при попытке запуска приложения TornadoFX

Не уверен, что заставляет его не находить функцию «init» на моем представлении, поэтому я подумал, что отправлю сюда и посмотрю, есть ли у кого-нибудь еще эта проблема.

Все компилируется нормально! И затем, когда я запускаю свою программу, я получаю эту ошибку:

java.lang.InstantiationException: com.my.tfx.app.InputView at java.lang.Class.newInstance(Class.java:427) at tornadofx.FXKt.find(FX.kt:372) at tornadofx.FXKt.find$default(FX.kt:358) at tornadofx.App.start(App.kt:80) at com.my.tfx.app.UserInputUI.start(UserInputUI.kt:15) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication.lambda$null$5(GtkApplication.java:139) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NoSuchMethodException: com.my.tfx.app.InputView.<init>() at java.lang.Class.getConstructor0(Class.java:3082) at java.lang.Class.newInstance(Class.java:412) ... 13 more 

Не совсем уверен, что вызывает это. У меня есть такая настройка:

 class UserInputUI : App(InputView(SVGEnum.first, StringEnum.first, UserInput.validationFunctions)::class, UIStyles::class) { init { reloadStylesheetsOnFocus() } override fun start(stage: Stage) { super.start(stage) stage.minWidth = 1024.0 stage.minHeight = 768.0 stage.maxWidth = 2560.0 stage.maxHeight = 1440.0 } } class InputView(val s: SVGEnum, val q: StringEnum, val valFunArray : ArrayList<(String)-> Boolean>) : View() { override val root = stackpane { //contents ommitted cause they're super long and I dont think its relevant, //but I can add it in if requested } } 

Есть идеи? Или это ошибка? Благодаря!

В представлениях должен быть нет конструктора args, чтобы они могли быть созданы с помощью фреймворка. В вашем подклассе приложения ( UserInputUI ) вы фактически InputView youtrself, а затем вызываете ::class чтобы получить KClass. Вы должны только передать его KClass напрямую, поэтому вам нужно изменить свой код, чтобы UserInputUI определялся следующим образом:

 class UserInputUI : App(InputView::class, UIStyles::class) 

(Я опустил блок init и start override. Кстати, убедитесь, что вы не вызываете reloadStylesheetsOnFocus в процессе производства. Чтобы убедиться, что он никогда не выводит его на производство, удалите его и установите параметр в TornadoFX IDEA Run Configuration istead ).

Затем вы должны убедиться, что InputView имеет конструктор noargs. Вам нужно использовать другую технику для передачи в нее параметров. Поскольку вы жестко закодировали их в своем классе App, вы можете просто жестко закодировать их непосредственно в InputView , или вы можете ввести ViewModel который вы настраиваете в App.start на основе параметров командной строки или файла конфигурации, если хотите.

InputView что просто InputView значения в InputView вместо UserInputIU будет выглядеть примерно так:

 class InputView() : View() { val s: SVGEnum = SVGEnum.first val q: StringEnum = StringEnum.first val valFunArray: ArrayList<(String) -> Boolean> = UserInput.validationFunctions override val root = stackpane { } } 

Надеюсь, что это прояснит вопрос 🙂