好的,所以我有一个非常具体而且非常复杂的问题,因为我是一名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;
}
}
}
}
});
答案 0 :(得分:0)
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;
}
}
}
}
。所有需要更改文本框值的小部件都需要捕获...