JavaFX可编辑组合框不允许重复项

JavaFX可编辑组合框不允许重复项,java,javafx,combobox,textfield,selectionmodel,Java,Javafx,Combobox,Textfield,Selectionmodel,我希望有一个可编辑的组合框,其中包含某些类型的项目(例如整数),我可以在其中添加和删除项目,允许用户编辑现有项目,并允许重复项目 问题在于,每当用户编辑现有项并将其值更改为列表中已存在项的值时,编辑器(textfield)会导致选择模型选择列表中已存在的项,而不是修改已编辑项 我试图通过创建一个包含该项并具有唯一索引的包装器类来避免这种情况。但是,这会导致StringConverter.fromString出现问题,因为每次转换时我都必须创建一个新的包装器 我认为一个简单的解决方案是,每当进行编

我希望有一个可编辑的组合框,其中包含某些类型的项目(例如整数),我可以在其中添加和删除项目,允许用户编辑现有项目,并允许重复项目

问题在于,每当用户编辑现有项并将其值更改为列表中已存在项的值时,编辑器(textfield)会导致选择模型选择列表中已存在的项,而不是修改已编辑项

我试图通过创建一个包含该项并具有唯一索引的包装器类来避免这种情况。但是,这会导致StringConverter.fromString出现问题,因为每次转换时我都必须创建一个新的包装器

我认为一个简单的解决方案是,每当进行编辑时,阻止编辑器搜索项目,这样选择模型就不会改变

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

import java.util.Arrays;

public class ComboBoxTest extends Application {

    private final ComboBox<Integer> comboBox = new ComboBox<>();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        final Group root = new Group();
        root.getChildren().add(comboBox);

        final Scene scene = new Scene(root, 200, 200);
        primaryStage.setScene(scene);
        primaryStage.show();

        comboBox.getItems().addAll(Arrays.asList(1, 2, 3, 4));
        comboBox.setConverter(
            new StringConverter<Integer>() {
                @Override
                public String toString(Integer integer) {
                    return integer == null ? "" : String.valueOf(integer);
                }

                @Override
                public Integer fromString(String s) {
                    return Integer.parseInt(s);
                }
            });
        comboBox.setPromptText("select value");
        comboBox.setEditable(true);
    }
}
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.ComboBox;
导入javafx.stage.stage;
导入javafx.util.StringConverter;
导入java.util.array;
公共类ComboBoxTest扩展了应用程序{
私有最终组合框ComboBox=新组合框();
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
最终组根=新组();
root.getChildren().add(组合框);
最终场景=新场景(根,200200);
初级阶段。场景(场景);
primaryStage.show();
comboBox.getItems().addAll(Arrays.asList(1,2,3,4));
comboBox.setConverter(
新的StringConverter(){
@凌驾
公共字符串到字符串(整数){
返回整数==null?”:String.valueOf(整数);
}
@凌驾
公共整数fromString(字符串s){
返回整数.parseInt;
}
});
comboBox.setPrompText(“选择值”);
comboBox.setEditable(真);
}
}

大多数情况下,重复在ui中没有意义。或者反过来说:大多数应用程序数据都比较复杂,至少彼此不完全相同,因此实际上,大多数时候都不会出现问题。请注意,最常见的情况是:)那么您的案例中的真实数据是什么,为什么列表中需要真实的副本?所有这些都说明:您的简单解决方案是无,包装器听起来是一种合理的方式(为什么这是一个问题?ID太多?)。另一种可能是在组合编辑器上使用TextFormatter,这样您只能在实际编辑时进行转换。无论如何,没有足够的细节来回答,请提供一个更接近您实际问题的答案。大多数情况下,重复在ui中没有意义。或者反过来说:大多数应用程序数据都比较复杂,至少彼此不完全相同,因此实际上,大多数时候都不会出现问题。请注意,最常见的情况是:)那么您的案例中的真实数据是什么,为什么列表中需要真实的副本?所有这些都说明:您的简单解决方案是无,包装器听起来是一种合理的方式(为什么这是一个问题?ID太多?)。另一种可能是在组合编辑器上使用TextFormatter,这样您只能在实际编辑时进行转换。无论如何,没有足够的细节来回答,请提供一个更接近你真正问题的答案。