java - javafx using objects from MainController or other Controllers in proper Controller class -


i have following code:

package pl.javastart.youtufy.controller;  import java.net.url; import java.util.resourcebundle;  import javafx.application.platform; import javafx.event.actionevent; import javafx.event.eventhandler; import javafx.fxml.fxml; import javafx.fxml.initializable; import javafx.scene.node; import javafx.scene.control.button; import javafx.scene.control.label; import javafx.scene.control.togglebutton; import javafx.scene.web.webengine; import javafx.stage.stage;  public class connectionerrorcontroller implements initializable {      @fxml     private label infolabel;      @fxml     private button trybutton;      @fxml     private button exitbutton;       @override     public void initialize(url location, resourcebundle resources) {          maincontroller mc = new maincontroller();          infolabel.settext("connection lost, please try again");         trybutton.settext("try again");         exitbutton.settext("exit");          trybutton.setonaction(new eventhandler<actionevent>() {             @override             public void handle(actionevent event) {                  webengine webengine = mc.getcontentpanecontroller().getvideowebview().getengine(); // 1                 togglebutton playbutton = mc.getcontrolpanecontroller().getplaybutton(); // 2                 node source = (node) event.getsource();                 stage stage = (stage) source.getscene().getwindow();                 if (mc.testinet()) {                     stage.close();                     mc.play(webengine, playbutton);                 } else {                     stage.close();                     maincontroller.exist = false;                 }             }         });          exitbutton.setonaction(new eventhandler<actionevent>() {             @override             public void handle(actionevent event) {                 platform.exit();             }         });     }  } 

i trying use webengine , togglebutton objects controllers in maincontroller (i generated getters , setters them in maincontroller):

public class maincontroller implements initializable {  @fxml private contentpanecontroller contentpanecontroller;  @fxml private controlpanecontroller controlpanecontroller;  @fxml private menupanecontroller menupanecontroller;  @fxml private searchpanecontroller searchpanecontroller;  private youtube youtubeinstance;  public static boolean exist = false;  public controlpanecontroller getcontrolpanecontroller() {     return controlpanecontroller; }  public void setcontrolpanecontroller(controlpanecontroller controlpanecontroller) {     this.controlpanecontroller = controlpanecontroller; }  public contentpanecontroller getcontentpanecontroller() {     return contentpanecontroller; }  public void setcontentpanecontroller(contentpanecontroller contentpanecontroller) {     this.contentpanecontroller = contentpanecontroller; } 

but still returns nullpointerexception. had same problem, when tried make references controllers in connectionerrorcontroller. how refer togglebutton webengine objects controllers in connectionerrorcontroller properly? regards

you creating controller instance "by hand"

maincontroller mc = new maincontroller(); 

@fxml-annotated fields initialized fxmlloader when creates controller part of process of loading fxml file. since controller created not controller instance created fxmlloader, @fxml-annotated fields uninitialized (i.e. null), , hence null pointer exception.

you can reference controller created fxmlloader calling getcontroller() on fxmlloader instance after calling load().

if want 1 controller communicate another, pass reference 1 controller other controller, defining appropriate methods in second controller:

public class connectionerrorcontroller implements initializable {      private maincontroller maincontroller ;      public void setmaincontroller(maincontroller maincontroller) {         this.maincontroller = maincontroller ;     }      // ...      @override     public void initialize(url location, resourcebundle resources) {          infolabel.settext("connection lost, please try again");         trybutton.settext("try again");         exitbutton.settext("exit");          trybutton.setonaction(new eventhandler<actionevent>() {             @override             public void handle(actionevent event) {                  webengine webengine = maincontroller.getcontentpanecontroller().getvideowebview().getengine(); // 1                 togglebutton playbutton = maincontroller.getcontrolpanecontroller().getplaybutton(); // 2                 if (maincontroller.testinet()) {                     maincontroller.play(webengine, playbutton);                 } else {                     // can better "public static field hack" here:                     maincontroller.exist = false;                 }                 trybutton.getscene().getwindow().hide();             }         });          // ...     } }     

assuming loading second fxml file in method in maincontroller, can like:

public class maincontroller {      // ...      public void showconnectionerrorwindow(string filename) {          fxmlloader loader = new fxmlloader(getclass().getresource("path/to/connectionerror.fxml"));         parent root = loader.load();         connectionerrorcontroller connectionerrorcontroller = loader.getcontroller();         connectionerrorcontroller.setmaincontroller(this);          scene scene = new scene(root);         stage stage = new stage();         // etc...     }      // ... } 

note there more elegant ways of solving problem, such passing connectionerrorcontroller callback function (in form of lambda expression) process call play(...), avoid tight coupling between connectionerrorcontroller , maincontroller. however, seem new java, simpler approach might more suitable.

see passing parameters javafx fxml more information on passing values controllers.


Comments

Popular posts from this blog

PHP and MySQL WP -

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

go - golang pprof for c library code -