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

时间:2016-10-27 11:18:52

标签: gwt

好的,所以我有一个非常具体而且非常复杂的问题,因为我是一名GWT新手。

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

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

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

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

可悲的是,我也无法提供我迄今为止的任何代码,因为它是商业机密。我只能对上述问题进行广泛的描述。

编辑: 实际上,就这个特定问题而言,可能更多的问题是没有太多代码。

我所拥有的是一个flex表,它最初只有标题行。单击此表下方的按钮后,将调用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
}

这样我就可以添加整行的可编辑TextBox。我需要的是一种影响所选行的第6列TextBox和所选行的第5列TextBox的值的方法。

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;
                }

            }
        }

    }
});

1 个答案:

答案 0 :(得分:0)

编辑:既然你编辑了你的问题并且你不想使用EventBus,你可以迭代你的inNetCDFFile = "D:/Data/3B43.20090201.7A.HDF.nc" 并设置你的FlexTable值,具体取决于你当前的rowIndex和cellIndex ......它不是很好但是它应该工作:

TextBox

我仍然建议使用eventbus。为了使它更方便,有GWT Event Binder lib,这使得使用事件变得轻而易举。

因此,当您更改文本框[2,5]中的值时,它也会触发您的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; } } } } 。所有需要更改文本框值的小部件都需要捕获...