当其他小部件的值发生变化时,在 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
。所有需要更改其文本框值的小部件只需要捕获...
好的,我有一个非常具体且对我来说非常复杂的问题,因为我是 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
。所有需要更改其文本框值的小部件只需要捕获...