gpt4 book ai didi

java - 通过 Java FX Controller 将数据传递到其他 View

转载 作者:行者123 更新时间:2023-12-01 09:31:03 25 4
gpt4 key购买 nike

我想这是一个简单的问题,但这是漫长的一天工作,我现在无法找到正确的出路。

我有 3 个 FXML 文件。

  • Menge.fxml
  • Start.fxml
  • Suche.fxml

我像往常一样从 Main.java 开始

@Override
public void start(Stage primaryStage) {
try {
AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("Start.fxml"));
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}

MainController内部,我有以下ActionListener

@FXML
void actionListenerMenge(ActionEvent event) {
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Menge.fxml"));
Parent root1 = (Parent) fxmlLoader.load();
Stage stage = new Stage();
stage.setScene(new Scene(root1));
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}

所以我通过 FXMLLoader 打开 Suche.fxml。现在,我的 Suche-View 中有一个按钮,它打开另一个场景,用户应在其中搜索特定数据记录。

@FXML
void actionListenerSuche(ActionEvent event) {
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Suche.fxml"));
Parent root1 = (Parent) fxmlLoader.load();
Stage stage = new Stage();
stage.setScene(new Scene(root1));
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}

SucheController,我通过 FXMLLoader 再次加载 MengeController

FXMLLoader loader = new FXMLLoader(getClass().getResource("Menge.fxml"));
try {
Parent root = loader.load();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MengeController controller = (MengeController)loader.getController();

我想编辑 TextField @ MengeController 中的值,以更新我的 Menge.fxml 中的 View 。但如果我这样做

controller.setTextFieldValue("abc") 它没有更新。我知道这一定是因为我加载了 MengeController 两次,所以有两个实例。但我不知道如何仅加载一次或注入(inject)它来更新 MengeController 内的 TextField

最佳答案

选项 1:观察 SucheController 中的属性:

SucheController 中定义一个属性。无需尝试获取对 MengeController 的引用,只需设置属性即可:

public class SucheController {

private final ObjectProperty<Foo> foo = new SimpleObjectProperty<>();

public ObjectProperty<Foo> fooProperty() {
return foo() ;
}

public final Foo getFoo() {
return fooProperty().get();
}

public final void setFoo(Foo foo) {
fooProperty().set(foo);
}

// ...

@FXML
private void someHandlerMethod() {

// FXMLLoader loader = new FXMLLoader(getClass().getResource("Menge.fxml"));
// try {
// Parent root = loader.load();
// } catch (IOException e) {
// e.printStackTrace();
// }
// MengeController controller = (MengeController)loader.getController();

setFoo(...);
}
}

显然将 Foo 替换为表示用户在此处提供的任何数据的类型,并相应地命名属性和方法...

现在,当您加载 Suche.fxml 时,只需获取对 Controller 的引用并观察属性即可。然后您可以直接在 MengeController 本身中更新文本字段:

@FXML
void actionListenerSuche(ActionEvent event) {
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Suche.fxml"));
Parent root1 = (Parent) fxmlLoader.load();

SucheController sucheController = loader.getController();
sucheController.fooProperty().addListener((obs, oldFoo, newFoo) -> {
someTextField.setText(newFoo.getSomeValue());
// ...
});

Stage stage = new Stage();
stage.setScene(new Scene(root1));
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
<小时/>

选项 2:将对 MengeController 的引用直接传递给 SucheController:

另一个选项,我不太喜欢它,因为它涉及 Controller 之间的更多耦合,只是将对 MengeController 的引用传递给 SucheController:

public class SucheController {

private MengeController mengeController ;

public void setMengeController(MengeController mengeController) {
this.mengeController = mengeController ;
}

// ...

@FXML
private void someHandlerMethod() {

mengeController.setTextFieldValue("abc");

}
}

然后 MengeController 中加载 Suche.fxml 的代码如下所示

@FXML
void actionListenerSuche(ActionEvent event) {
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Suche.fxml"));
Parent root1 = (Parent) fxmlLoader.load();

SucheController sucheController = fxmlLoader.getController();
sucheController.setMengeController(this);

Stage stage = new Stage();
stage.setScene(new Scene(root1));
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}

关于java - 通过 Java FX Controller 将数据传递到其他 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39396859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com