java - JavaFX - How to use a method in a controller from another controller? -


working scenebuilder. have 2 stages, each 1 controller: stage1controller, stage2controller.
stage1controller :

public class stage1controller {     @fxml     private menuitem translate;     @fxml     private menu file;     @fxml     private menu edit;     @fxml     private menu help;       @fxml      private void handletranslate (actionevent event){         translatefirststage();         //how access stage2controller setlabel()??     }      private void translatefirststage(){         file.settext("fichier");         edit.settext("modifier");         help.settext("aide");     } } 

stage2controller:

public class stage2controller {     @fxml     private label lb;       private void setlabel(string string){         lb.settext("string");     } } 

here how both fxml files loaded in main.java class using 2 methods (called in start(stage primarystage) method):

public void firststage() {         try {             // load root layout fxml file.             fxmlloader loader = new fxmlloader();             loader.setlocation(main.class.getresource("view/stage1.fxml"));             rootlayout = (borderpane) loader.load();              // show scene containing root layout.             scene scene = new scene(rootlayout);             primarystage.setscene(scene);             primarystage.show();         } catch (ioexception e) {             e.printstacktrace();         }     }      public void secondstage() {          try {             // load root layout fxml file.             fxmlloader loader = new fxmlloader();             loader.setlocation(main.class.getresource("view/stage2.fxml"));             xd = (anchorpane) loader.load();              // show scene containing root layout.             scene scene = new scene(xd);             stage stage = new stage();             stage.setscene(scene);             stage.show();         } catch (ioexception e) {             e.printstacktrace();         }     } 
  • the handletranslate(actionevent event) method used onaction method menuitem translate in first stage, translates view in both stages.

how can put setlabel in handletranslate method ? thanks

the "quick , dirty" way give stage1controller reference stage2controller:

public class stage1controller {      private final stage2controller stage2controller ;      public void setstage2controller(stage2controller stage2controller) {         this.stage2controller = stage2controller ;     }      // ...      @fxml      private void handletranslate (actionevent event){         translatefirststage();         stage2controller.setlabel(...);     }      // other code before ... } 

now in main app:

public class mainapp  extends application {      private stage1controller stage1controller ;     private stage2controller stage2controller ;      @override     public void start(stage primarystage) {         firststage();         secondstage();          stage1controller.setstage2controller(stage2controller);          // ...     }      public void firststage() {         try {             // load root layout fxml file.             fxmlloader loader = new fxmlloader();             loader.setlocation(main.class.getresource("view/stage1.fxml"));             rootlayout = (borderpane) loader.load();              stage1controller = loader.getcontroller();              // show scene containing root layout.             scene scene = new scene(rootlayout);             primarystage.setscene(scene);             primarystage.show();         } catch (ioexception e) {             e.printstacktrace();         }     }      public void secondstage() {          try {             // load root layout fxml file.             fxmlloader loader = new fxmlloader();             loader.setlocation(main.class.getresource("view/stage2.fxml"));             xd = (anchorpane) loader.load();              stage2controller = loader.getcontroller();              // show scene containing root layout.             scene scene = new scene(xd);             stage stage = new stage();             stage.setscene(scene);             stage.show();         } catch (ioexception e) {             e.printstacktrace();         }     }      // ... } 

a more robust approach this, though, let both controllers access shared model class, storing data. if represent data using javafx observable properties, controllers can listen changes on properties care about. example:

public class model {      private final stringproperty text = new simplestringproperty("initial text...");      public stringproperty textproperty() {         return text ;     }      public final void settext(string text) {         textproperty().set(text);     }      public final string gettext() {         return textproperty().get();     }      // other properties needed... } 

now controllers this:

public class stage1controller {      private model model ;      public void setmodel(model model) {         this.model = model ;     }      @fxml      private void handletranslate (actionevent event){         translatefirststage();          model.settext(...); // value appear in stage2 controller's label!     }      // ... } 

and

public class stage2controller {      @fxml     private label lb ;      private model model ;      public void setmodel(model model) {         lb.textproperty().unbind();         this.model = model ;         lb.textproperty().bind(model.textproperty());     }      // ... } 

and in case main app looks like:

public class mainapp extends application {      private final model = new model();      @override     public void start(stage primarystage) {         // ...     }      public void firststage() {         try {             // load root layout fxml file.             fxmlloader loader = new fxmlloader();             loader.setlocation(main.class.getresource("view/stage1.fxml"));             rootlayout = (borderpane) loader.load();              stage1controller controller = loader.getcontroller();             controller.setmodel(model);              // show scene containing root layout.             scene scene = new scene(rootlayout);             primarystage.setscene(scene);             primarystage.show();         } catch (ioexception e) {             e.printstacktrace();         }     }      public void secondstage() {          try {             // load root layout fxml file.             fxmlloader loader = new fxmlloader();             loader.setlocation(main.class.getresource("view/stage2.fxml"));             xd = (anchorpane) loader.load();              stage2controller controller = loader.getcontroller();             controller.setmodel(model);              // show scene containing root layout.             scene scene = new scene(xd);             stage stage = new stage();             stage.setscene(scene);             stage.show();         } catch (ioexception e) {             e.printstacktrace();         }     } } 

Comments

Popular posts from this blog

css - SVG using textPath a symbol not rendering in Firefox -

Java 8 + Maven Javadoc plugin: Error fetching URL -

node.js - How to abort query on demand using Neo4j drivers -