java - Loader instantiation throws nullpointer in JavaFX -


i have declared 2 fxml files , controller each one: rootlayoutcontroller controller rootlayout.fxml , overviewcontroller controller overview.fxml

rootlayout has menu bar file open item, , overviewcontroller has draw button.

i have class called datastructure. want open file , send path overviewcontroller. when click draw constructor of dartastructure shall instantiated, path parameter. click open, on file chooser open dialog, program throws nullpointer in handleopen() method. source not found!

in main class wrap overview in rootlayout , show stage.

rootlayoutcontroller:

public class rootlayoutcontroller { private final model model;  public rootlayoutcontroller(model model){ this.model  = model; }  /**  * opens filechooser let user select .z3lgm file load.  */ @fxml private void handleopen() {      filechooser filechooser = new filechooser();      // set extension filter     filechooser.extensionfilter extfilter = new filechooser.extensionfilter(             "3lgm2 files (*.z3lgm)", "*z3lgm");     filechooser.getextensionfilters().add(extfilter);      // show open file dialog     file file = filechooser.showopendialog(main.getprimarystage());          if (file != null) {         path = file.tostring();              model.settext(path);//error       }  } } 

overviewcontroller:

public class overviewcontroller implements initializable { private final model model;  public overviewcontroller(model model){     this.model  = model; } public void treetabledraw(actionevent event) {     string p = model.gettext();      new controller(p);     drawtable();     numberoffunctions = dc.getfuncall().size();     numberoforganizations = dc.getsortedassignedorg().size();     funclabel.settext(numberoffunctions + "");     orglabel.settext(numberoforganizations + "");     btndraw.setdisable(true);  } } 

error stack:

exception in thread "javafx application thread" java.lang.runtimeexception: java.lang.reflect.invocationtargetexception @ javafx.fxml.fxmlloader$methodhandler.invoke(fxmlloader.java:1770) @ javafx.fxml.fxmlloader$controllermethodeventhandler.handle(fxmlloader.java:1653) @ 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:49) @ javafx.event.event.fireevent(event.java:198) @ javafx.scene.control.menuitem.fire(menuitem.java:462) @ com.sun.javafx.scene.control.skin.contextmenucontent$menuitemcontainer.doselect(contextmenucontent.java:1405) @ com.sun.javafx.scene.control.skin.contextmenucontent$menuitemcontainer.lambda$createchildren$341(contextmenucontent.java:1358) @ com.sun.javafx.scene.control.skin.contextmenucontent$menuitemcontainer$$lambda$326/15872584.handle(unknown source) @ com.sun.javafx.event.compositeeventhandler$normaleventhandlerrecord.handlebubblingevent(compositeeventhandler.java:218) @ com.sun.javafx.event.compositeeventhandler.dispatchbubblingevent(compositeeventhandler.java:80) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:238) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:191) @ com.sun.javafx.event.compositeeventdispatcher.dispatchbubblingevent(compositeeventdispatcher.java:59) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:58) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:114) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:56) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:114) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:56) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:114) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:56) @ 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:198) @ javafx.scene.scene$mousehandler.process(scene.java:3758) @ javafx.scene.scene$mousehandler.access$1500(scene.java:3486) @ javafx.scene.scene.impl_processmouseevent(scene.java:1762) @ javafx.scene.scene$scenepeerlistener.mouseevent(scene.java:2495) @ com.sun.javafx.tk.quantum.glassvieweventhandler$mouseeventnotification.run(glassvieweventhandler.java:350) @ com.sun.javafx.tk.quantum.glassvieweventhandler$mouseeventnotification.run(glassvieweventhandler.java:275) @ java.security.accesscontroller.doprivileged(native method) @ com.sun.javafx.tk.quantum.glassvieweventhandler.lambda$handlemouseevent$350(glassvieweventhandler.java:385) @ com.sun.javafx.tk.quantum.glassvieweventhandler$$lambda$209/5704663.get(unknown source) @ com.sun.javafx.tk.quantum.quantumtoolkit.runwithoutrenderlock(quantumtoolkit.java:404) @ com.sun.javafx.tk.quantum.glassvieweventhandler.handlemouseevent(glassvieweventhandler.java:384) @ com.sun.glass.ui.view.handlemouseevent(view.java:555) @ com.sun.glass.ui.view.notifymouse(view.java:927) @ com.sun.glass.ui.gtk.gtkapplication._runloop(native method) @ com.sun.glass.ui.gtk.gtkapplication.lambda$null$48(gtkapplication.java:139) @ com.sun.glass.ui.gtk.gtkapplication$$lambda$41/19140780.run(unknown source) @ java.lang.thread.run(thread.java:745)  caused by: java.lang.reflect.invocationtargetexception @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:497) @ sun.reflect.misc.trampoline.invoke(methodutil.java:71) @ sun.reflect.generatedmethodaccessor1.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:497) @ sun.reflect.misc.methodutil.invoke(methodutil.java:275) @ javafx.fxml.fxmlloader$methodhandler.invoke(fxmlloader.java:1767) ... 46 more caused by: java.lang.nullpointerexception @ view.rootlayoutcontroller.handleopen(rootlayoutcontroller.java:174) ... 56 more 

main class:

public class main extends application { private stage primarystage; private borderpane rootlayout; private model model = new model;  // private observablelist<dataconstructor> treetabledata = // fxcollections.observablearraylist();  @override public void start(stage primarystage) {      this.primarystage = primarystage;     this.primarystage.settitle("it-saturation");     initrootlayout();     showoverview();  }  private void showoverview() {     try {         fxmlloader loader = new fxmlloader();          loader.setlocation(main.class.getresource("/view/overview.fxml"));         loader.setcontroller(new overviewcontroller(model));     //  parent firstui = loader.load();         anchorpane overview = (anchorpane) loader.load();         rootlayout.setcenter(overview);         // overviewcontroller controller = loader.getcontroller();         // controller.setmainapp(this);     } catch (ioexception e) {         e.printstacktrace();     } }  private void initrootlayout() {     try {         fxmlloader loader = new fxmlloader();         loader.setlocation(main.class.getresource("/view/rootlayout.fxml"));         loader.setcontroller(new rootlayoutcontroller(model));          rootlayout = (borderpane) loader.load();         // show scene containing root layout         scene scene = new scene(rootlayout);         scene.getstylesheets().add(                 getclass().getresource("application.css").toexternalform());         primarystage.setscene(scene);         // gives controller access main         rootlayoutcontroller controller = loader.getcontroller();         controller.setmainapp(this);         primarystage.show();      } catch (ioexception e) {          e.printstacktrace();     }   }  /**  * returns main stage.  *   * @return primarystage  */ public stage getprimarystage() {     return primarystage; }  public static void main(string[] args) {     launch(args); }      public void showmostcomputerizedstatistics() {     try {         // load fxml file , create new stage popup.         fxmlloader loader = new fxmlloader();         loader.setlocation(main.class                 .getresource("view/birthdaystatistics.fxml"));         anchorpane page = (anchorpane) loader.load();         stage dialogstage = new stage();         dialogstage.settitle("birthday statistics");         dialogstage.initmodality(modality.window_modal);         dialogstage.initowner(primarystage);         scene scene = new scene(page);         dialogstage.setscene(scene);          // set persons controller.         mostcomputerizedcontroller controller = loader.getcontroller();          dialogstage.show();      } catch (ioexception e) {         e.printstacktrace();     } }  } 

this rootlayout fxml:

<?xml version="1.0" encoding="utf-8"?>    <?import javafx.scene.input.*?>  <?import javafx.scene.control.*?>  <?import java.lang.*?>  <?import javafx.scene.layout.*?>  <?import javafx.scene.layout.borderpane?>    <borderpane prefheight="500.0" prefwidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" >     <top>        <menubar borderpane.alignment="center">          <menus>            <menu text="_file">              <items>                    <menuitem onaction="#handleopen" text="_open" />                    <menuitem mnemonicparsing="false" onaction="#handleexportpic" text="export picture" />                    <menuitem mnemonicparsing="false" text=" save as" />                    <menuitem mnemonicparsing="false" onaction="#doprint" text="print" />                <menuitem onaction="#handleexit" text="e_xit">                       <accelerator>                          <keycodecombination alt="up" code="x" control="down" meta="up" shift="up" shortcut="up" />                       </accelerator></menuitem>              </items>            </menu>              <menu mnemonicparsing="false" onaction="#handlemostcomputerizedstatistics" text="statistics">                <items>                  <menuitem mnemonicparsing="false" onaction="#handlemostcomputerizedstatistics" text="show statistics" />                </items>              </menu>            <menu mnemonicparsing="false" text="help">              <items>                <menuitem mnemonicparsing="false" text="about" />              </items>            </menu>          </menus>        </menubar>     </top>  </borderpane>

and overview fxml:

<?xml version="1.0" encoding="utf-8"?>    <?import javafx.scene.text.*?>  <?import javafx.scene.control.*?>  <?import java.lang.*?>  <?import javafx.scene.layout.*?>  <?import javafx.scene.layout.anchorpane?>    <anchorpane prefheight="400.0" prefwidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" >     <children>        <splitpane dividerpositions="0.2391304347826087" layoutx="62.0" layouty="52.0" prefheight="400.0" prefwidth="600.0" anchorpane.bottomanchor="0.0" anchorpane.leftanchor="0.0" anchorpane.rightanchor="0.0" anchorpane.topanchor="0.0">          <items>            <anchorpane minheight="0.0" minwidth="0.0" prefheight="160.0" prefwidth="100.0" splitpane.resizablewithparent="false">                 <children>                    <button fx:id="btndraw" layoutx="24.0" layouty="297.0" mnemonicparsing="false" onaction="#treetabledraw" text="draw" anchorpane.leftanchor="22.0" anchorpane.rightanchor="36.0" />                    <label fx:id="funclabel" layoutx="24.0" layouty="155.0" opacity="0.72" prefheight="15.0" prefwidth="38.0" text="0" anchorpane.bottomanchor="190.0" anchorpane.leftanchor="24.0" anchorpane.rightanchor="77.0">                       <font>                          <font size="10.0" />                       </font></label>                    <label fx:id="orglabel" layoutx="17.0" layouty="219.0" opacity="0.72" prefheight="14.0" prefwidth="38.0" text="0" anchorpane.bottomanchor="165.0" anchorpane.leftanchor="24.0" anchorpane.rightanchor="84.0" anchorpane.topanchor="219.0">                       <font>                          <font size="10.0" />                       </font></label>                    <label layoutx="63.0" layouty="155.0" text="functions" anchorpane.bottomanchor="190.0">                       <font>                          <font size="11.0" />                       </font>                    </label>                    <label layoutx="56.0" layouty="219.0" text="organizations" anchorpane.bottomanchor="165.0" anchorpane.topanchor="213.0">                       <font>                          <font size="10.0" />                       </font>                    </label>                    <button fx:id="btnreset" layoutx="21.0" layouty="345.0" mnemonicparsing="false" onaction="#treetablereset" onkeypressed="#treetablereset" prefheight="25.0" prefwidth="81.0" text="reset" anchorpane.leftanchor="22.0" anchorpane.rightanchor="36.0" />                 </children></anchorpane>            <anchorpane minheight="0.0" minwidth="0.0" prefheight="160.0" prefwidth="100.0" splitpane.resizablewithparent="false">                 <children>                    <scrollpane fx:id="scrollpane" prefheight="398.0" prefwidth="480.0" anchorpane.bottomanchor="0.0" anchorpane.leftanchor="0.0" anchorpane.rightanchor="0.0" anchorpane.topanchor="0.0">                       <content>                          <treetableview fx:id="treetable" editable="true" prefheight="375.0" prefwidth="246.0" />                       </content>                    </scrollpane>                 </children></anchorpane>          </items>        </splitpane>     </children>  </anchorpane>

fxmlloader.getcontroller() return null if call before load() method has been called (because if hasn't loaded fxml file, doesn't know controller is).

but still not going want. want reference controller instance associated root of fmxl file that displayed in ui. doesn't arbitrary controller instance, whether getting fxmlloader or instantiating directly.

the controller instance want 1 can calling loader.getcontroller() in showoverview() method in main class. if want controllers communicate each other, need arrange rootlayoutcontroller instance have reference overviewcontroller instance.

it might better not have controllers have direct access each other, let them communicate data in shared data model. this question has simple example of approach.


Comments

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

gradle error "Cannot convert the provided notation to a File or URI" -

python - NameError: name 'subprocess' is not defined -