如何根据另一列值更改生成列中选择的选择值在表中更改

问题描述:

,有两列,每列都有一个下拉列表。如何根据另一列值更改生成列中选择的选择值在表中更改

final Table archivesTable = new Table(); 
archivesTable.setTableFieldFactory(new TableFieldFactory() { 
    @Override 
    public Field createField(Container container, Object itemId, 
          Object propertyId, Component uiContext) { 
     Select sel = new Select(); 
     try (SSEConnector c = CisApplication 
           .generateSseConnector((SseConnection) sseSetupSelect 
           .getValue())) { 
      for (String s : c.getListOfArchives()) 
       sel.addItem(s); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("yes 2"); 
     return sel; 
    } 
}); 

archivesTable.addGeneratedColumn("reportName", 
    new Table.ColumnGenerator() { 
     @Override 
     public Object generateCell(Table source, final Object itemId, Object columnId) { 
      reportSelect = new Select(); 
      try (SSEConnector c = CisApplication 
            .generateSseConnector((SseConnection) sseSetupSelect 
            .getValue())) { 
       for (String s : c.getListOfArchives()) 
        reportSelect.addItem(s); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      System.out.println("yes 3"); 
      return reportSelect; 
     } 
    } 
); 

正如我们所看到的,我想在表中的第一列从第1个任意值变动“选择”的影响值在表中的第2列第2个“选择”。怎么样?

生成的列不影响vaadin表的底层数据容器。它们是在飞行中生成的,并且没有为它们创建属性。因此,没有明显的方式直接访问它们。

实现此行为的丑陋方法是预生成两个列的所有控件并将它们绑定在一起。将它们储存在地图结合itemId

Collection itemIds = archivesTable.getItemIds(); 
final HashMap<Object,Select> firstColumnSelects = new HashMap<Object, Select>(); 
final HashMap<Object,Select> secondColumnSelects = new HashMap<Object, Select>(); 
for(Object itemId : itemIds) { 
    final Select secondColumnSelect = new Select(); 
    //initialize select for the second column 
    secondColumnSelect.setImmediate(true); 
    Select firstColumnSelect = new Select(); 
    //initialize select for the first column 
    firstColumnSelect.addListener(new ValueChangeListener() { 

    @Override 
    public void valueChange(ValueChangeEvent event) { 
     //setting value to the list in second column 
     secondColumnSelect.setValue(event.getProperty().getValue()); 
    } 
    }); 
    firstColumnSelect.setImmediate(true); 
    firstColumnSelects.put(itemId, firstColumnSelect); 
    secondColumnSelects.put(itemId, secondColumnSelect); 
} 

然后,而不是在飞行中产生控件只是返回预先生成的列表:

//... 
@Override 
public Field createField(Container container, final Object itemId, Object propertyId, Component uiContext) { 
    return firstColumnSelects.get(itemId); 
} 
//... 
@Override 
public Object generateCell(Table source, final Object itemId, Object columnId) { 
    return secondColumnSelects.get(itemId); 
} 

清洁的方法是完全不使用生成列。生成的列并不意味着大量参与数据操作。相反,你可以创建一个单独的类来表示表记录,并执行所有的交互出现的:

public class TableDisplayBean { 
    private Select firstSelect; 
    private Select secondSelect; 

    public TableDisplayBean() { 
     //initialization of controls, value change handling goes here 
    } 

    public Select getFirstColumn() { 
     return firstSelect; 
    } 
    public Select getSecondColumn() { 
     return secondSelect; 
    } 
} 

所有剩下的就是用BeanItemContainer豆的集合绑定到表。