Я использовал учебник TornadoFX для вызова метода контроллера из представления при нажатии кнопки (пытаясь использовать MVC вместо 1 массового представления). Таймер в этом контроллере вызывает функции из модели, которая отображает видео. Изображение живого потока больше не отображается на экране (холст javafx) теперь, когда я делаю парадигму MVC.
Представление успешно вызывает контроллер с помощью «inject ()», и я вижу из отладчика вызываемый метод init контроллера, который запускает таймер, и все методы в таймере выполняются (видеофайлы сохраняются правильно, поэтому я знаю, что это проблема MVC, передавая холст). В частности, метод, который рисует изображение, не показывает изображение на экране (это вызов drawImage для объекта javafx.scene.canvas.context, который не показывает мне холст.
...view class ...
val controller : CameraController by inject()
init {
}
...controller class...
//neither passing canvas or context works
fun start(canvasRGB : Canvas, canvasGray : Canvas) {
initOpenCV()
//this.canvasRGB = canvasRGB //NO, casting to nullable issues
//val g2dRGB = canvasRGB.graphicsContext2D
//val g2dGray = canvasGray.graphicsContext2D
cameraSensor.initVideoCamera()//(g2dRGB, g2dGray)
timer.start()
}
...cameraSensor.defaultVideoStream(false)
...sensor model class...
fun defaultVideoStream(..., canvasRGB : javafx.scene.canvas.Canvas) {
val g2dRGB = canvasRGB.graphicsContext2D
//read camera data and write to image
try {
videoCapture.read(image)
videoWriter.write(image)
g2dRGB.drawImage(CvUtil.mat2Image(image), 0.0, 0.0) //draws
}
Я не знаю, существует ли какой-то конкретный способ MVC передать холст или контекст и убедиться, что он отображается в представлении, все кнопки и надписи в представлении правильно отображаются в своих vbox (ранее холст был определен в том же классе, что и корень представления, которое позволило его отображать там)
Я все еще не могу создать контроллер или модель с параметром после того, как мне здесь помог разработчик Dev из TornadoFX, я попытался использовать инъекцию в области видимости, разрешить данные в области видимости и новую передачу параметров: Добавление представления с аргументами конструктора в пограничное стекло .
Я разочарован проблемами обнуляемости в Kotlin, потому что я не могу определить переменную без ее создания (не могу сделать ни одного из исправлений intelliJ, потому что объекты OpenCV не поддерживают приведение к nullable), даже если я сохраню значение в init или start функции.