繁体   English   中英

JavaFX-ComboBox更新从另一个控制器获取数据

[英]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并包含一个带有一些登录buttonsComboBoxBorderPane作为根。 用户登录完成后,以下代码示例将加载我的第二个控制器。

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
  • ChildController

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM