Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据其他列值的更改来更改生成列中“选择”的选定值_Java_Select_Listener_Vaadin - Fatal编程技术网

Java 如何根据其他列值的更改来更改生成列中“选择”的选定值

Java 如何根据其他列值的更改来更改生成列中“选择”的选定值,java,select,listener,vaadin,Java,Select,Listener,Vaadin,表中有两列,每列都有一个下拉列表 final Table archivesTable = new Table(); archivesTable.setTableFieldFactory(new TableFieldFactory() { @Override public Field createField(Container container, Object itemId, Object propertyId, Comp

表中有两列,每列都有一个下拉列表

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列中第1个Select的任何值更改都会影响表中第2列中第2个Select的值。怎么做

生成的列不会影响vaadin表的底层数据容器。它们是动态生成的,不会为它们创建任何属性。因此,没有明显的方法可以直接访问它们

实现这种行为的丑陋方法是为两个列预生成所有控件并将它们绑定在一起。将它们存储在映射绑定到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;
    }
}
剩下的就是将bean集合绑定到表

//...
@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;
    }
}