当其他小部件的值发生变化时,在 GWT flex table 中更改小部件的值?

Change value of widget inside GWT flex table when other widget's value changes?

好的,我有一个非常具体且对我来说非常复杂的问题,因为我是 GWT 新手。

我有一个 GWT flex table,我用它来动态添加行,其单元格包含 GWT 小部件。行号发生变化,但静态列数始终为 6。每行包含一个带有删除按钮的单元格和五个单元格,每个单元格都有自己的文本框。

我需要做的是以某种方式编写一行单元格 6 中的文本框与下一行单元格 5 中的文本框之间的一种关系(反之亦然)。

举例说明:当 [1,6] 处的文本框发生变化时,[2,5] 处的文本框内容需要用相同的值覆盖。如果 [2,5] 处的文本框更改,[1,6] 处的文本框也需要更改。我不能使用按钮来提交更改,它需要通过 onValueChange 或 Blur 或类似的东西发生,不需要用户执行特定的操作。

我的问题主要源于试图弄清楚如何处理 flex table 中的特定单元格及其内容。对于删除按钮,使用点击事件处理程序解决方案很简单,但对于这个问题,我似乎无法想出解决方案。

遗憾的是,我也无法提供我目前拥有的任何代码,因为这是商业机密。我只能像上面那样大致描述问题。

编辑: 实际上,就这个具体问题而言,可能更多的是代码不多的问题。

我有一个 flex table,最初只有 header 行。单击此 table 下方的按钮后,将调用 addNewField() 方法,该方法仅包含创建、设置默认值以及将文本字段添加到新行中。

addNewField() {
int rows = flextable.getRowCount();
Button removeBtn = new Button("x");
removeBtn.getElement().setId(Integer.toString(rows));
//then the button's event handler
TextBox name = new TextBox();
name.setText("something");
flextable.setWidget(rows, 0, "name");
//repeat 4 more times with incrementing columns for the other widgets
}

通过这种方式,我添加了整行 editable 文本框。我需要的是一种方法来影响所选行的第 6 列 TextBox 和所选行的第 5 列 TextBox 的值 + 1.

EDIT2:我已经尝试了脏选项只是为了看看它会如何进行以及 if 中的比较以某种方式破坏了应用程序。编译器检测到 nullpointerexception,我什至无法使用断点对其进行调试,因为它无法编译并且无法启动。我不知道为什么。为了测试目的,我将代码直接放入事件中,所以请原谅丑陋。

TextBox bis = new TextBox();
bis.setText(rows + ":10:00");
subs.setWidget(rows, 5, bis);

bis.addValueChangeHandler(new ValueChangeHandler<String>()
{

    @Override
    public void onValueChange(ValueChangeEvent<String> event)
    {
        allRows: for (int i = 0; i < subs.getRowCount(); i++)
        {
            for (int j = 0; j < subs.getCellCount(i); j++)
            {
                if ( subs.getWidget(i, j) == bis )
                {
                    TextBox widgetAtColumnSix = ((TextBox) subs.getWidget(i, 5));
                    String text = widgetAtColumnSix.getText();

                    TextBox widgetAtColumnFiveRowPlusOne = ((TextBox) subs.getWidget(i + 1, 4));
                    widgetAtColumnFiveRowPlusOne.setText(text);
                    break allRows;
                }

            }
        }

    }
});

编辑:因为你编辑了你的问题并且你不想使用 EventBus 你可以迭代你的 FlexTable 并根据你当前的 rowIndex 和 cellIndex 设置你的 TextBox 值......它不是不错,但应该可以用:

public class CellWidget extends Composite {

    private TextBox nameBox;

    public CellWidget() {
        FlowPanel flowPanel = new FlowPanel();
        Button deleteButton = new Button("x");
        nameBox = new TextBox();
        nameBox.addValueChangeHandler(new ValueChangeHandler<String>() {

            @Override
            public void onValueChange(ValueChangeEvent<String> event) {
                notifiyTextBox(CellWidget.this, event.getValue());
            }
        });
        flowPanel.add(nameBox);
        flowPanel.add(deleteButton);
        initWidget(flowPanel);
    }

    public void setText(String text) {
        nameBox.setText(text);
    }

}

public void notifiyTextBox(CellWidget source, String string) {
    rows: for (int i = 0; i < flextable.getRowCount(); i++) {
        columns: for (int j = 0; j < flextable.getCellCount(i); j++) {
            if (flextable.getWidget(i, j) == source) {
                CellWidget widgetAtColumnSix = ((CellWidget) flextable.getWidget(i, 5));
                widgetAtColumnSix.setText(string);

                CellWidget widgetAtColumnFiveRowPlusOne = ((CellWidget) flextable.getWidget(i + 1, 4));
                widgetAtColumnFiveRowPlusOne.setText(string);
                break rows;
            }

        }
    }

}

我仍然会推荐使用事件总线。 GWT Event Binder 库使它更加方便,它使事件的使用变得轻而易举。

因此,当您更改文本框[2,5] 中的值时,它也会触发您的 CustomEvent。所有需要更改其文本框值的小部件只需要捕获...