代码之家  ›  专栏  ›  技术社区  ›  kscherrer

Vaadin 8-在组合框中排序项目<整数>

  •  2
  • kscherrer  · 技术社区  · 8 年前

    我有一个Integer类型的组合框,设置如下:

    Collection<Integer> cbItems = new HashSet<>();
    for(Integer i = 100; i < 360; i+=5){
        cbItems.add(i);
    }
    ComboBox<Integer> cb = new ComboBox<>();
    cb.setItems(cbItems);
    

    我创建一个整数集合,并用某些整数值(100、105、110等)填充它。代码将编译,组合框将显示在视图中。

    我的问题是组合框中的项目没有排序(或者更好:没有按我认为的方式排序)。

    Screenshot of the actual Combobox

    为什么它会对我的整数集合重新排序,如何防止它?

    2 回复  |  直到 7 年前
        1
  •  4
  •   pirho    8 年前

    我建议您填充 组件,如 ComboBox 具有 DataProvider . 这会让事情变得更容易。

    如果以后没有向 组合框 在别处如果添加了项目,则可能需要执行 Collections.sort() 再一次

    使用上有点变化 数据提供者 :

    ListDataProvider<Integer> dp = new ListDataProvider<>(cbItems);
    // the first param is function that returns the value to sort
    // in case of Integer it is that Integer itself.
    dp.setSortOrder(i -> {return i;}, SortDirection.ASCENDING);
    ComboBox<Integer> combo = new ComboBox<>();
    combo.setDataProvider(dp);
    

    现在,如果您稍后将项目添加到combo(通过原始 Collection ):

    // add some items to see where they are sorted
    cbItems.add(102);
    cbItems.add(113);
    

    这些项目应在中排序到正确的位置 组合框 .

    然后考虑一个更复杂的例子。如果你上过这样的课:

    @RequiredArgsConstructor
    public class Wrapper {
       @Getter 
       private final Integer id;
       @Getter
       private final String name;
    }
    

    您希望按名称降序排序,它将类似于(使用测试数据):

    // generate some dymmy data
    Collection<Wrapper> wrappers = new HashSet<>();
    for(int i=1000; i<=2000; i+=150) {
       wrappers.add(new Wrapper(i, 
               "Rand"+ThreadLocalRandom.current().nextInt(5000, 6000)) );
    }
    
    ListDataProvider<Wrapper> dpWrappers = new ListDataProvider<>(wrappers);
    // now function returns the name of the wrapper to sort as sort argument
    dpWrappers.setSortOrder(wrapper -> {return wrapper.getName();}, 
                                SortDirection.DESCENDING);
    
    ComboBox<Wrapper> comboWrappers = new ComboBox<>();
    comboWrappers.setDataProvider(dpWrappers);
    // remember to set this to have the name of wrapper in combo vaptions
    // instead of the value of  Wrapper.toString();
    comboWrappers.setItemCaptionGenerator( item -> {return item.getName();});
    
        2
  •  0
  •   kscherrer    8 年前

    好吧,我想出来了:
    我将集合更改为列表(ArrayList),以便使用 Collections.sort(cbItems);

    List<Integer> cbItems= new ArrayList<>();
    for(Integer i = 100; i < 360; i+=5){
        cbItems.add(i);
    }
    Collections.sort(cbItems);
    
    ComboBox<Integer> cb = new ComboBox<>();
    cb.setItems(cbItems);
    

    现在项目按升序排序。