Съвет за технология за разработка на десктоп приложение или/и помощ с JavaFX
Здравейте,
Имам едно WPF приложение - направено с C# и XAML за графичната част. Нещата си работят супер под Windows, но шефчето реши, че трябва да стане мултиплатформено - до върви поне и под Linux. Реших че JavaFX е най-добрия избор, защото си помислих че концепциите ще са напълно същите като при MS нещата и ще успея бързо да го портна но явно съм объркал
Да кажа накратко какво е приложението:
Чете данни през сериeн порт от една платка (пращаш адреси, платката връща съответните данни). Като прочете данните ги прекарва през едни декодиращи функции/формули и изкарва резултатите на textblock-ове или там както се наричат в Java - labels. Тия лейбъли/текстблокове са около 80 на брой и са разпределени в 5 таба. Има и 10-на combobox-а и toggle бутони за настройките на платката. Важен фийчър е способността да чете някакъв скрипт (Python, Perl или TCL няма значение) с който да се get-ват стойностите от някои лейбъли и да се set-ват настройките който могат да се сетват с бутоните и комбо боксовете и бутоните. Това на C# го направих с IronPython.
Как е направено със C#:
В общи линии всичките променливи които пазят данните за GUI-то от viewmodel - а са bind-нати в XAML-а. В самия viewmodel имаме един background worker който изпълнява главния loop while(SerialPort.IsOpen()) . В този loop имаме следната последователност - WriteSettinggs(), ReadALLData(), DecodeData(). Последния метод променя байнднатите данни и те си се ъпдейтват на екрана и всичко е OK.
Какъв ми е проблемът с JavaFX(освен това че съм пълен индианец който още се учи ):
Не намерих background worker в Java който да работи като този в C#. Провбам с един Thread - в който се изпълнява main-loop-a и след това в Platform.runLater() да сетна байнднатите StringProperty - та. Общо взето използвам този код.
Тъпото е че не успях по този начин да накарам байндинга в FXML файла да работи и трябва да се байндва с Java код. Това решение ми изглежда абсурдно и не вярвам да няма друг начин защото:
-Това значи че в контролера трябва за всеки лейбъл да се съдвама new label с името на id-то от fxml-а (@FXML Label sameNameAsFxmlId = new Label())
- За всеки лейбъл трябва да има съответното StringProperty което ще байндваме
- За всяко String property трябва да имаме променливата която ще му сетваме
- по един ред в който да казваме на всеки лейбъл кое пропърти да му байнднем
Както казах - това за над 80 лейбъла, с тенденция да се увеличават - правете си сметката колко малоумно би било всичко това . Ще съм благодарен на някакъв акъл или линк към материали за четене
Един колега със самочувстнието на много печен Java програмист и той не намери по добро решение. Опита се да автоматизира този процес в следствие на което нещата стигнаха до "не променяй fxml-а защото всичко се чупи" - това според мен е доста неприемливо, отделно че се получи доста неразбираем код
Ако няма културен начин това да стане с Java, бих зопачнал да правя това нещо с друга технология. Като цяло нямам фиксиран срок, а пък и каквото и ново нещо да науча е добре дошло. Изискванията са следните
- Да има комуникация през сериен порт
- да върви както на Windows, така и на Linux
- Да поддръжа някакъв стайлинг - да може да стане eye candy. Само стандартните контроли не са приемливи
- да има начин да се направи приложението да чете скриптове на Python, TCL, Perl или нещо друго
Ще съм благодарен на всякакъв акъл. Щом съм опрял до форума значи нещата са сериозни