选择组件上的 Vaadin ValueChangeListener 无法正常工作

Posted

技术标签:

【中文标题】选择组件上的 Vaadin ValueChangeListener 无法正常工作【英文标题】:Vaadin ValueChangeListener on select component doesn't work fine 【发布时间】:2012-10-18 14:47:55 【问题描述】:

ValueChangeListener 有问题。我有这个代码:

private void caricaSelectMainUser()
    Object[] a = socFilName.get(0);
    List<String> elencosoc = societaDao.getSocieta();
    List<String> socUtente = app.getUserDao().getSocietaByUname(app.getCod_utente());   

    for (int i = 0; i < elencosoc.size(); i++)             
        societa.addItem(elencosoc.get(i));
                
    caricaMenuFiliale();
    caricaMenuRisorsa();
    societa.select(socUtente.get(0));   
    filiale.select(a[1]);
    nome.select(a[2]);

    societa.addListener(new Property.ValueChangeListener() 

        @Override
        public void valueChange(ValueChangeEvent event) 
            filiale.removeAllItems();
            caricaMenuFiliale();
            nome.removeAllItems();
           
    );   

    filiale.addListener(new Property.ValueChangeListener() 

        @Override
        public void valueChange(ValueChangeEvent event) 
            System.out.println("entro nel listener filiale");
            nome.removeAllItems();
            caricaMenuRisorsa();
           
    );       

    nome.addListener(new ValueChangeListener() 

        @Override
        public void valueChange(ValueChangeEvent event) 
            getValuesFromDropDown();
           
    );       

    getValuesFromDropDown();

这部分代码管理“società”、“filiale”和“name”的监听器。

private void caricaMenuFiliale() 
    List<Object[]> elencofilNew = app.getUserDao().getDescFilialeSoc(societa.getValue().toString());
    mapFiliale = new HashMap<String,Object>();
    for (int i = 0; i < elencofilNew.size(); i++) 
        Object[] a = elencofilNew.get(i);
        for (int j = 0; j < a.length; j++) 
            mapFiliale.put(a[1].toString(), a[0]);
            filiale.addItem(a[1]);
        
    


private void caricaMenuRisorsa() 
    List<Object[]> elencoNominativiNew = app.getUserDao().getNominativiFromSoc(societa.getValue().toString());
    map = new HashMap<String,Object>();
    for (int i = 0; i < elencoNominativiNew.size(); i++) 
        Object[] a = elencoNominativiNew.get(i);
        map.put((String) a[0],a[1]);                        
        nome.addItem((String) a[0].toString());

    


private void getValuesFromDropDown() 
    String codsoc = societa.getValue().toString();
    String codfil = mapFiliale.get(filiale.getValue().toString()).toString();
    String codper = map.get(nome.getValue()).toString();
    String mm = (mese.getValue().toString().length()==1?("0"+mese.getValue().toString())emoticonmese.getValue().toString()));
    String aaaamm = anno.getValue().toString() + mm;

顺序流程应该是当“societa”更改时,选择“filiale”加载与所选“society”的数据绑定,当“filiale”更改“name”时加载与“society”和“的数据绑定”分流”选择。但是当我选择一个新的“社会”时,下面的代码就开始了

nome.addListener(new ValueChangeListener() 

    @Override
    public void valueChange(ValueChangeEvent event) 
        getValuesFromDropDown();
       
);    

我在

上看到了 NullPointerException
String codfil = mapFiliale.get(filiale.getValue().toString()).toString();

在 getValuesFromDropDown() 方法中。如果我从选择“nome”的 valueChangeListener 中取消此方法调用,一切正常。我知道我的逻辑可能有一些问题,但我不知道为什么会出现这种行为。谁能帮帮我?

谢谢。

【问题讨论】:

在这部分代码中: String codfil = mapFiliale.get(filiale.getValue().toString()).toString();空值字段是filiale.getValue().toString() 不,我的意思是...具体是什么是空的。使用你的调试器,找出什么是空的。在此处发布。 "filiale" 为空。但是,目前我使用按钮冻结了问题。这样我可以处理不同的选择组件避免疯狂的听众,但我需要以我个人的知识解决这个问题!!! 因此,如果 filiale 为空,则意味着它不是 vaadin 问题。我猜这是一个范围问题。如果没有整个文件,就不可能确切知道出了什么问题,但这是基本的 Java 调试,没有特定于 vaadin 的内容。 不写很多我不知道如何解释:如果你看到,有三个听众(societa、filiale 和 nome)。选择 societs 时,加载 fiilee,选择 filiale 时,加载 nome。我认为问题也不在于 vaadin 组件,但是当应用程序启动时,侦听器“nome”会自动启动(这是我的 NullPointerException 的原因(因为 filiale 尚未加载)。如果我不写 nome.addListener (这样,组件“nome”上就没有监听器了,一切正常!!我确定问题比看起来更愚蠢,但我还没有解决问题...... 【参考方案1】:

在 societa 监听器中调用 nome.removeAllItems()。这将触发名称 AbstractSelect 中的 Property.ValueChangeEvent。

societa.addListener(new Property.ValueChangeListener() 
    @Override
    public void valueChange(ValueChangeEvent event) 
        filiale.removeAllItems();
        caricaMenuFiliale();
        nome.removeAllItems();
       
);

【讨论】:

以上是关于选择组件上的 Vaadin ValueChangeListener 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Vaadin - 添加组件作为另一个组件的元素

Vaadin 7 在执行后台线程后不刷新 UI(仅当它需要超过 5 分钟时)

Vaadin中用于标识shared state内部属性的annotation @NoLayout的作

如何在 Vaadin Flow 14 中创建一个简单的 HTML 表格

Vaadin:上传按钮监听器

是否可以在 Vaadin 14 的一个组件中以内联模式使用两个 DatePicker?