Monday 15 June 2015

java - javafx 8 compatibility issues - FXML static fields -



java - javafx 8 compatibility issues - FXML static fields -

i have designed javafx application works fine in jdk 7. when seek run in java 8 getting below exceptions:

javafx.fxml.loadexception: @ javafx.fxml.fxmlloader.constructloadexception(fxmlloader.java:2617) @ javafx.fxml.fxmlloader.loadimpl(fxmlloader.java:2595) @ javafx.fxml.fxmlloader.loadimpl(fxmlloader.java:2441) @ javafx.fxml.fxmlloader.loadimpl(fxmlloader.java:3230) @ javafx.fxml.fxmlloader.loadimpl(fxmlloader.java:3191) @ javafx.fxml.fxmlloader.loadimpl(fxmlloader.java:3164) @ javafx.fxml.fxmlloader.loadimpl(fxmlloader.java:3140) @ javafx.fxml.fxmlloader.load(fxmlloader.java:3132) exception in thread "javafx application thread" java.lang.nullpointerexception: root cannot null @ javafx.scene.scene.<init>(scene.java:364) @ javafx.scene.scene.<init>(scene.java:232) @ com.sun.javafx.event.compositeeventhandler.dispatchbubblingevent(compositeeventhandler.java:86) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:238) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:191) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:58) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:114) @ com.sun.javafx.event.eventutil.fireeventimpl(eventutil.java:74) @ com.sun.javafx.event.eventutil.fireevent(eventutil.java:54) @ javafx.event.event.fireevent(event.java:204) @ javafx.concurrent.eventhelper.fireevent(eventhelper.java:219) @ javafx.concurrent.task.fireevent(task.java:1357) @ javafx.concurrent.task.setstate(task.java:720) @ javafx.concurrent.task$taskcallable$2.run(task.java:1438) @ com.sun.javafx.application.platformimpl$6$1.run(platformimpl.java:301) @ com.sun.javafx.application.platformimpl$6$1.run(platformimpl.java:298) @ java.security.accesscontroller.doprivileged(native method) @ com.sun.javafx.application.platformimpl$6.run(platformimpl.java:298) @ com.sun.glass.ui.invokelaterdispatcher$future.run(invokelaterdispatcher.java:95) @ com.sun.glass.ui.win.winapplication._runloop(native method) @ com.sun.glass.ui.win.winapplication.access$300(winapplication.java:39) @ com.sun.glass.ui.win.winapplication$4$1.run(winapplication.java:112) @ java.lang.thread.run(thread.java:744)

i found out reason in initialize method of controller class not able utilize inbuilt methods in static component. (for example: staticmytextfield.settext() causing problem in java 8 not in java 7). not able find out documented regarding in javafx guides. can please provide ideas on why causing issue in java 8? , share documents related if any.

it sounds trying inject textfield static field. like

@fxml private static textfield mytextfield ;

this apparently worked in javafx 2.2. doesn't work in javafx 8. since no official documentation ever supported use, it's doesn't violate backward compatibility, though in fairness documentation on fxmlloader pretty woeful.

why ever want though? it's terrible idea. suppose decided reuse fxml file twice in same application: sec utilize overwrite value static field, , sorts of chaos ensue. put, if trying have static fields injected in controller, you're doing things wrong anyway.

update: response question in comments

in particular, don't utilize static fields enable them accessible outside class. static field has single value belonging class, instead of value each instance of class, , decision create fields static should made if makes sense. allow access instance data, have have reference instance. fxmlloader has getcontroller() method allows retrieve reference controller.

a related point: it's not thought expose ui controls controller. should instead expose data. example, instead of defining gettextfield() method in controller, instead define textproperty() method returns stringproperty representing contents of textfield. reason when boss comes office , tells wants textfield replaced textarea, or combobox<string>, or other control, it's going lot harder if classes outside of controller using textfield. construction of info represented controller much less alter implementation of how info presented user.

for examples

passing parameters javafx fxml javafx info mangement access fields controller in javafx https://github.com/james-d/leastcommonmultiplecalculator https://github.com/james-d/nested-controller-example https://github.com/james-d/dialog-fxml-example https://github.com/james-d/shared-data-controller

java javafx-2 java-7 java-8 javafx-8

No comments:

Post a Comment