JavaFX-如何在另一个控制器中的一个控制器中使用方法?

使用SceneBuilder。我有2个阶段,每个阶段都有一个控制器:

stage1Controller

stage2Controller

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");

}

}

这是使用2种方法

(称为in Start(Stage primaryStage)方法)将这两个fxml文件加载到Main.java类中的方式:

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();

// 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();

// 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();

}

}

  • handleTranslate(ActionEvent event)方法在第一阶段中用作OnAction方法MenuItem translate,它在两个阶段都转换视图。

回答:

“快速又脏”的方法是给的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 Stage2Controller {

@FXML

private Label lb ;

private Model model ;

public void setModel(Model model) {

lb.textProperty().unbind();

this.model = model ;

lb.textProperty().bind(model.textProperty());

}

// ...

}

在这种情况下,您的主应用程序如下所示:

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();

}

}

}

以上是 JavaFX-如何在另一个控制器中的一个控制器中使用方法? 的全部内容, 来源链接: utcz.com/qa/410163.html

回到顶部