Java从UserList和setItems ComboBox获取UserName

时间:2018-03-14 07:37:05

标签: java javafx combobox

我有这个:

@FXML
private ChoiceBox<String> choiseData;

ObservableList<String> choiseUserList = FXCollections.observableArrayList();
ObservableList<User> userList = FXCollections.observableArrayList();    
AdminSQL sql = new AdminSQL();
userList = sql.getAllUser();

for (User u : userList)
choiseUserList.add(u.getUserLogin());
choiseData.setItems(choiseUserList);

我不喜欢这两个列表和循环。我想知道你是否只能直接从userList列表下载用户登录并将它们放在ChoiseBox

班级用户:

private IntegerProperty userLp;
private StringProperty userLogin;
private StringProperty userRule;

2 个答案:

答案 0 :(得分:1)

最有可能的是,你不希望将ChoiceBox项目作为从真实项目中映射一次(不知何故)的列表,因为这样做会带来一些缺点:

  • 两个列表可以轻松地不同步:当用户更改或其任何属性时,ChoiceBox不会更新
  • 听f.i. ChoiceBox中的选择更改,监听器没有关于用户的完整信息(来自selectedItem),而只是其中一个属性值 - 如果它想要对用户起作用,则必须在某处查找信息否则,引入(不需要的)耦合
  • 你正在奋斗fx,它专门支持配置任何数据对象的可视化表示 - 在ChoiceBox的情况下,你需要一个StringConverter

示例代码段:

ChoiceBox<User> choiceBox =  new ChoiceBox<>(getUsers()); 
    // from your snippet, AdminSQL already returns the list as
    // an ObservableList, so you can set it directly as provided
    // new ChoiceBox<>(sql.getAllUsers()); 
StringConverter<User> converter = new StringConverter<>() {

    @Override
    public String toString(User user) {
        return user != null ? user.getUserLogin() : "";
    }

    @Override
    public User fromString(String userLogin) {
        // should never happen, choicebox is not editable
        throw new UnsupportedOperationException("back conversion not supported from " + userLogin);
    }

};
choiceBox.setConverter(converter);

答案 1 :(得分:0)

使用Java 8 Streams

choiseData.getItems().addAll(userList.stream().map(User::getUserLogin()));