2013-03-13 123 views
0

,有兩列,每列都有一個下拉列表。如何根據另一列值更改生成列中選擇的選擇值在表中更改

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個「選擇」。怎麼樣?

回答

0

生成的列不影響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豆的集合綁定到表。

相關問題