java - TextField.bindAutoCompletion 返回对象 ID

标签 java javafx java-8 javafx-8 controlsfx

我有以下代码来构建状态组合框。该代码按预期工作,但是我无法让自动完成功能正常工作。看来自动完成返回的是对象 ID,而不是预期的文本。单击下拉菜单会显示正确的缩写州名。我哪里错了?

private void buildStateCombo() {
        List<StatesDTO> states = GetStateList.getStatesList();
        StateCombo.setItems(FXCollections.observableList(states));
        StateCombo.setEditable(true);
        TextFields.bindAutoCompletion(StateCombo.getEditor(), StateCombo.getItems());

        /**
         *  StringConverter
         */
        StateCombo.setConverter(new StringConverter<StatesDTO>() {
            
            @Override
            public String toString(StatesDTO object) {
                if (object == null){
                    return null;
                } else {
                    return object.getStateShort();
                }
              }

         
            @Override
            public StatesDTO fromString(String string) {
                return DriverAddStateCombo.getItems().stream().filter(state -> 
                    state.getStateShort().equals(string)).findFirst().orElse(null);
            }
        });
}

GetStateList 看起来像这样...

public class GetStateList {

    public static List<StatesDTO> getStatesList() {
        Database db = new Database();
        List<StatesDTO> statesList = new ArrayList<>();
        try {
            String query = "SELECT stateID, stateCode FROM States";
            ResultSet statesRS = db.executeQuery(query);
            while(statesRS.next()) {
                StatesDTO statesdto = new StatesDTO();
                statesdto.setStateID(statesRS.getString(1));
                statesdto.setStateShort(statesRS.getString(2));
                statesList.add(statesdto);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        db.closeConnection();
        
        return statesList;
    }

}

和州DTO

public class StatesDTO {
    public SimpleStringProperty stateID = new SimpleStringProperty();
    public SimpleStringProperty stateShort = new SimpleStringProperty();
        
    public String getStateID() {
        return stateID.get();
    }

    public void setStateID(String stateIDStr) {
        stateID.set(stateIDStr);
    }
    
    public String getStateShort() {
        return stateShort.get();
    }

    public void setStateShort(String stateShortStr) {
        stateShort.set(stateShortStr);
    }
}

最佳答案

我可以使用的一种方法是直接在集合中提供名称。

TextFields.bindAutoCompletion(StateCombo.getEditor(), 
    StateCombo.getItems().stream().map(state -> 
    state.getStateShort()).collect(Collectors.toList()) );

我尝试了该方法的不同签名,例如

bindAutoCompletion(TextField textField, Callback> suggestionProvider, StringConverter converter)

但我无法让它发挥作用。

注意:ControlsFX 版本 8.40.12。

关于java - TextField.bindAutoCompletion 返回对象 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786126/

相关文章:

java - saveInstanceState 根据之前的用户操作更改颜色

java - 在Java中使用apache commons vfs2访问后删除zip文件

java - 如何使用Javafx Canvas 围绕另一个圆移动一个点?

java - GroupingBy 使用 Java 8 流

java - 如何从 LinkedList 中删除中间节点?

java - 使用 JOLT 将 JSON 字符串数组转换为对象数组

java - Android Studio 无法从 'generated_java' 文件夹导入 java

java - 如何在javaFx中绘制具有多个点的线?

Java流。提取多个 map 的不同值

java - 如何修复这个竞争条件错误?