2015-02-24 47 views
0

我有代表员工的模型。它有一个领域(比方说薪水),这也是一个模型。所以基本上它是一个嵌套的属性。我使用Hibernate,JPAcontainer和MasterDetailEditor来可视化数据。所以我扩展了FieldFactory,以便能够在薪水的select字段中添加一个值更改侦听器。这种变化设定了薪水的税收领域。Vaadin用户界面不刷新

它工作时,数据在DB,但在UI更新,不。我尝试启用Push,使用pollInterval,它们都不起作用。我通过它的属性来设置价值。

代码:

这是重写createField

final AbstractField field = (AbstractField) super.createField(container, itemId, propertyId, uiContext); 
     field.setImmediate(true); 

     field.addValueChangeListener(new Property.ValueChangeListener() { 
      @Override 
      public void valueChange(ValueChangeEvent event) { 

       final Item item = container.getItem(itemId); 
       final String salaryTypeSelectorValue = 
         item.getItemProperty(propertyName).getValue().toString() != null ? item.getItemProperty(propertyName).getValue() 
           .toString() : REGULAR; 

           if (REGULAR.equals(salaryTypeSelectorValue)) { 

            final SalaryHistory salaryHistory = ((JPAContainer<SalaryHistory>) container).getItem(itemId).getEntity(); 

            JPAContainer<SalaryHistory> salaryHistoryContainer = (JPAContainer<SalaryHistory>) container; 

            salaryHistoryContainer.getItem(itemId).getItemProperty("socialTax").setValue(new BigDecimal("28.5"));          
           } 
      } 
     });   

     return field; 

更新

我设法达到我想要的,也许这是一个有点哈克,因为我不得不把薪水模型中的一个小逻辑:在薪水类型的设置者中,我也设置了税收,UI立即更新。

+0

我的猜测是,这jpacontainer持有缓存和地方在改变它的值将传播到表。你有没有试过把桌子弄脏? – cfrick 2015-02-24 16:29:31

+0

我会试试。谢谢。我忘记提及JPAContainerFactory.makeNonCached被使用,并且立即模式为真,并且缓冲被禁用。 – user3511545 2015-02-24 16:32:46

+0

如果您自己解决问题,请为该帖子添加一个答案(并稍后再接受)。其他用户更容易识别可能的解决方案并查看问题已解决。谢谢! – 2015-02-26 10:21:38

回答

0

感谢您通知我Jan :)我成功实现了我想要的,也许这有点冒险,因为我必须在薪酬模型中加入一个小逻辑:在薪水类型的设置者中,我也设置了税并且UI立即更新。