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
Post a Comment