![](/img/trans.png)
[英]JavaFX and FXML - update label with data from another controller
[英]JavaFX - ComboBox update fetching data from another controller
这是我的小问题:
@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()
之后添加Items。
仅当我在ComboBox中选择一个项目来更新其他项目时,我当前的解决方案才有效。
我的第一个控制器管理着根Pane并包含一个带有一些登录buttons
和ComboBox
的BorderPane
作为根。 用户登录完成后,以下代码示例将加载我的第二个控制器。
AnchorPane barHolder = (AnchorPane) overviewLoader.load();
BorderPane root = (BorderPane) loginwithsec.getScene().getRoot();
root.setCenter(barHolder);
loginwithsec
是我的first controller
定义的@FXML
doc按钮。
overviewLoader
是第二个控制器的FXMLLoader。
现在,用户应在first Controller
管理的窗格的组合框中选择一个Person
。
概述(第二个控制器)通过某些DAO的AFAIK Hibernate load the data
用于当前选择 。 因此,必须将延迟加载的DAO自动填充到ComboBox
以向用户显示某些个人可用。
让我们考虑您有两个控制器,并称它们为
ParentController
有一个ObservableList parentList
,它用作ComboBox
的项目。
public class ParentController {
...
private ObservableList parentList = FXCollections.observableArrayList();
...
}
ChildController
有一个ObservbleList childList
,它使用休眠(或其他方式)从数据库中填充。 我们需要将此数据传递回parentList
以填充其数据。
public class ChildController {
...
private ObservableList childList = FXCollections.observableArrayList();
...
}
我们通过公共方法公开childList
public class ChildController {
...
private ObservableList childList = FXCollections.observableArrayList();
public ObservableList getChildList() {
return childList;
}
// Some logic to load the list
...
}
回到ParentController
,因为我们使用的是ObservableList
而不是List
,所以我们可以利用并绑定父级和子级控制器中列表的数据。 Bindings.bindContentBidirectional()
确保任何一个列表中的更改都会反映在另一个列表中。
public class ParentController {
...
@FXML
ComboBox comboBox;
private ObservableList parentList = FXCollections.observableArrayList();
public void initialize() {
comboBox.setItems(parentList);
Bindings.bindContentBidirectional(parentList, childController.getChildList());
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.