gpt4 book ai didi

JavaFX - 组合框更新从另一个 Controller 获取数据

转载 作者:太空宇宙 更新时间:2023-11-04 13:58:47 25 4
gpt4 key购买 nike

这是我的小问题:

@FXML 
private ComboBox<Person> personcb;
private ObservableList<Person> persons = FXCollections.observableArrayList();

private ResourceBundle langBundle;

@Override
public void start(Stage primaryStage) {
try {
this.Stage = primaryStage;
this.Stage.initStyle(StageStyle.UNDECORATED);
rootLayout = initRootLayout(Locale.getDefault());
Scene scene = new Scene(rootLayout);
scene.getStylesheets().add(getClass().getResource("any.css").toExternalForm());
Stage.setScene(scene);
Stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}

@Override
public void initialize(URL location, ResourceBundle resources) {
langBundle = resources;
lblTextByController.setText(langBundle.getString("key1"));
personcb.valueProperty().addListener(new ChangeListener<Person>() {

@Override
public void changed(ObservableValue<? extends Person> observable,
Person oldValue, Person newValue) {
System.out.println("value updated");
}
});
}

@FXML
private void persons() {
try{
if(personcb.getItems() == null || personcb.getItems().size() != secondController.getUSER().getPersons().size()){
ObservableList<Person> persons=
FXCollections.observableArrayList();
options.addAll(secondController.getUSER().getPersons());
personcb.setItems(persons);
personcb.setPromptText(langBundle.getString("key402") +" [" + personcb.size()+"]");
}
}
catch(NullPointerException e){
}
}

在我的 FXML 文件中,组合框定义为:

<ComboBox fx:id="personcb" onShowing="#persons" prefWidth="200.0" promptText="%key402">

我想在我的第二个 Controller 的第一个 Controller 的initialize()之后添加项目。

仅当我在组合框中选择一个项目来更新其他项目时,我当前的解决方案才有效。

<小时/>

编辑 - 更多信息

我的第一个 Controller 管理根 Pane ,并作为根包含一个 BorderPane 以及一些用于登录的按钮ComboBox。用户登录完成后,我的第二个 Controller 将通过以下代码示例加载。

AnchorPane barHolder = (AnchorPane) overviewLoader.load(); 
BorderPane root = (BorderPane) loginwithsec.getScene().getRoot();
root.setCenter(barHolder);

loginwithsec 是在我的第一个 Controller 定义的 @FXML 文档中的按钮。

overviewLoader 是第二个 Controller 的 FXMLLoader。

现在,用户应在第一个 Controller 管理 Pane 的组合框中选择一个Person

概述(第二个 Controller )通过某些 DAO 的 AFAIK Hibernate 为当前选择加载数据。因此,延迟加载的 DAO 必须自动填充到 ComboBox 中,以向用户显示某些 Person 可用。

最佳答案

让我们假设您有两个 Controller 并调用它们

  • 父 Controller
  • 子 Controller

ParentController 有一个 ObservableList ParentList,用作 ComboBox 中的项目。

public class ParentController {
...
private ObservableList parentList = FXCollections.observableArrayList();
...
}

ChildController 有一个 ObservbleList childList,它是使用 hibernate(或其他方式)从数据库填充的。我们需要将此数据传递回 parentList 以填充其数据。

public class ChildController {
...
private ObservableList childList = FXCollections.observableArrayList();
...
}

我们通过公共(public)方法公开childList

public class ChildController {
...
private ObservableList childList = FXCollections.observableArrayList();

public ObservableList getChildList() {
return childList;
}
// Some logic to load the list
...
}

回到ParentController,由于我们使用ObservableList而不是List,我们可以利用并绑定(bind)父 Controller 和子 Controller 中列表的数据。 Bindings.bindContentBidirection() 确保任一列表中的任何更改都会反射(reflect)在另一个列表中。

public class ParentController {
...
@FXML
ComboBox comboBox;

private ObservableList parentList = FXCollections.observableArrayList();

public void initialize() {
comboBox.setItems(parentList);
Bindings.bindContentBidirectional(parentList, childController.getChildList());
}
...
}

关于JavaFX - 组合框更新从另一个 Controller 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29530628/

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