JavaFX-如何从另一个控制器在控制器中使用方法?
使用SceneBuilder。我有两个阶段,每个阶段都有一个控制器:JavaFX-如何从另一个控制器在控制器中使用方法?,java,javafx,controller,javafx-8,scenebuilder,Java,Javafx,Controller,Javafx 8,Scenebuilder,使用SceneBuilder。我有两个阶段,每个阶段都有一个控制器:stage1Controller,stage2Controller Stage1控制器: public class Stage1Controller { @FXML private MenuItem translate; @FXML private Menu file; @FXML private Menu edit; @FXML private Menu help
stage1Controller
,stage2Controller
Stage1控制器:
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 TO ACCESS THE stage2Controller setLabel()??
}
private void translateFirstStage(){
file.setText("Fichier");
edit.setText("Modifier");
help.setText("Aide");
}
}
public class Stage2Controller {
@FXML
private Label lb;
private void setLabel(String string){
lb.setText("string");
}
}
Stage2控制器:
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 TO ACCESS THE stage2Controller setLabel()??
}
private void translateFirstStage(){
file.setText("Fichier");
edit.setText("Modifier");
help.setText("Aide");
}
}
public class Stage2Controller {
@FXML
private Label lb;
private void setLabel(String string){
lb.setText("string");
}
}
下面是如何使用两种方法将两个fxml文件加载到Main.java类中
(在
Start(Stage primaryStage)
method中调用):
方法用作handleTranslate(ActionEvent事件)
方法,用于OnAction
在第一阶段,它在两个阶段中转换视图MenuItem translate
setLabel
放入handleTranslate
方法?谢谢快速而肮脏的方法是给Stage1Controller
一个对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 as before ...
}
现在在主应用程序中:
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 from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("view/stage1.fxml"));
rootLayout = (BorderPane) loader.load();
stage1Controller = loader.getController();
// Show the scene containing the root layout.
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
public void secondStage() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("view/stage2.fxml"));
XD = (AnchorPane) loader.load();
stage2Controller = loader.getController();
// Show the scene containing the root layout.
Scene scene = new Scene(XD);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
// ...
}
不过,更可靠的方法是让两个控制器访问共享模型类,存储数据。如果使用JavaFX可观察属性表示数据,那么控制器可以侦听它们关心的属性的更改。例如:
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 as needed...
}
现在,您的控制器将如下所示:
public class Stage1Controller {
private Model model ;
public void setModel(Model model) {
this.model = model ;
}
@FXML
private void handleTranslate (ActionEvent event){
translateFirstStage();
model.setText(...); // value will appear in stage2 controller's label!
}
// ...
}
及
在这种情况下,您的主应用程序如下所示:
public class MainApp extends Application {
private final Model = new Model();
@Override
public void start(Stage primaryStage) {
// ...
}
public void firstStage() {
try {
// Load root layout from 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 the scene containing the root layout.
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
public void secondStage() {
try {
// Load root layout from 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 the scene containing the root layout.
Scene scene = new Scene(XD);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
与相应控制器对应的fxml文件在哪里加载?(您需要在
Stage1Controller
中引用您的Stage2Controller
实例)这两个fxml文件都加载在mainApp类中,该类与这两个文件分开。请编辑您的问题以显示该代码。完成后,我添加了如何加载这两个fxml文件。是的,谢谢;这很有帮助。见答案。