尝试运行TornadoFX应用程序时出现java.lang.NoSuchMethodException

时间:2017-06-24 19:50:48

标签: kotlin tornadofx

不知道是什么导致它在我的View上找不到“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
  }

}

有什么想法吗?或者这是一个错误?谢谢!

1 个答案:

答案 0 :(得分:3)

视图必须具有无args构造函数,以便它们可以由框架实例化。在您的app子类(UserInputUI)中,您实际实例化了InputView,然后调用::class来获取它的KClass。您只应该直接将它传递给KClass,因此您需要修改代码,以便UserInputUI定义如下:

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

(我省略了init块和启动覆盖。顺便说一句,确保你没有在生产中调用reloadStylesheetsOnFocus。为了确保它永远不会生产,删除它并设置选项在TornadoFX IDEA运行配置中。)

接下来,您必须确保InputView有一个noargs构造函数。您需要使用另一种技术将参数传递给它。由于您在App类中对它们进行了硬编码,因此您也可以直接在InputView中对它们进行硬编码,或者您可以根据命令行参数引入您在ViewModel中配置的App.start或如果你愿意的话,配置文件。

只需对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 {
    }
}

我希望澄清问题:)