gpt4 book ai didi

java - 在 Vaadin 中即时同步两个表

转载 作者:行者123 更新时间:2023-12-04 04:43:09 24 4
gpt4 key购买 nike

在我的 Vaadin UI 中,我有以下场景:

Table sketch

换句话说,有两个表:

  • 可编辑的“主”表,
  • 不可编辑的“从”表,但必须包含与主表相同的数据,但排序顺序可能不同。

  • 最后的要求排除了具有相同 Container 的表(以我的理解,这可能是错误的)。

    我目前所做的是附上一个 ItemSetChangeListener和一个 ValueChangeListener ,并使用事件相应地更新数据。

    这是当前的粗略实现(实际上是在 Scala 中,但我希望它具有足够的可读性,如果不是,请发表评论):
    class DataTableSynchronizer(val master: Table, val slave: Table) extends ItemSetChangeListener with ValueChangeListener {

    def init():Unit = {
    master.addItemSetChangeListener(this)
    containerMaster.addListener(this.asInstanceOf[ValueChangeListener])

    }

    private def containerOf(t: Table) = t.getContainerDataSource().asInstanceOf[IndexedContainer]

    private def containerMaster = containerOf(master)

    private def containerSlave = containerOf(slave)

    override def containerItemSetChange(event: ItemSetChangeEvent) {
    //handling
    //remove all items that have been deleted
    for(toDel <- containerSlave.getItemIds().filterNot(containerMaster.containsId(_))) {
    containerSlave.removeItem(toDel)
    }

    //add new items to the start
    for(toAdd <- containerMaster.getItemIds().filterNot(containerSlave.containsId(_))) {
    containerSlave.addItem(toAdd)
    }
    slave.validate();
    }

    override def valueChange(event: ValueChangeEvent) = {
    updateValuesInResults()
    }

    private def updateValuesInResults(): Unit = {
    //update all values in the "slave" table from the "master" table
    for((itemData,itemResults) <- containerMaster.getItemIds().map(id => (containerMaster.getItem(id),containerSlave.getItem(id)))) {
    for(propId <- itemData.getItemPropertyIds()) {
    itemResults.getItemProperty(propId).asInstanceOf[Property[Any]].setValue(itemData.getItemProperty(propId).getValue().asInstanceOf[Any])
    }
    }
    }

    }

    但是,我的问题是 我需要不断同步数据,因为用户键入 ,由于仅在某些操作完成(添加一行等)后才会发送相关事件,因此不会发生这种情况。

    我该如何解决这个问题,即 我如何强制频繁发出事件以启用连续同步? 我唯一的想法是使用 ActionListener映射所有的键,但这叫“滥用”。

    注意:我意识到通过服务器端执行此操作效率较低,但在我的情况下这不是问题。然而,基于客户端的答案当然也可以。

    最佳答案

    您可以将编辑器的 TextChangeEventMode 设置为 EAGER 并在事件监听器中处理单次击键:

        TextField textField = ...;
    textField.setTextChangeEventMode(TextChangeEventMode.EAGER);
    textField.addTextChangeListener(new TextChangeListener() {
    @Override
    public void textChange(TextChangeEvent event) {
    String text = event.getText();
    // sync with other component
    }
    });

    关于java - 在 Vaadin 中即时同步两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18589931/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com