2016-10-27 2 views
0

Итак, у меня есть довольно конкретная и для меня довольно сложная проблема, так как я новичок в GWT.Изменить значение виджета внутри таблицы Flex GWT при изменении значения другого виджета?

У меня есть таблица Flex GWT, которую я использую для динамического добавления строк, чьи ячейки содержат виджеты GWT. Номер строки изменяется, но количество столбцов в статике всегда 6. Каждая строка содержит ячейку с кнопкой удаления и пять ячеек, каждая со своим собственным текстовым полем.

Что мне нужно сделать, так или иначе кодировать отношения между текстовым полем в ячейке 6 одной строки и текстовым полем в ячейке 5 в следующей строке (и наоборот).

Чтобы проиллюстрировать: когда что-то изменяется в текстовом поле в [1,6], содержимое текстового поля в [2,5] должно быть перезаписано с тем же значением. Если текстовое поле в [2,5] изменяет текстовое поле в [1,6], необходимо также изменить. Я не могу использовать кнопку для фиксации изменений, это должно произойти через onValueChange или Blur или что-то подобное, что не требует от пользователя выполнения определенного действия.

Моя проблема связана главным образом с попыткой выяснить, как обращаться с конкретными ячейками в таблице flex и их содержимом. Для кнопки удаления решение было достаточно простым с обработчиком событий щелчка, но для этой проблемы я просто не могу придумать решение.

К сожалению, я также не могу предоставить какой-либо код, который у меня есть до сих пор, так как это деловая тайна. Я могу только дать широкое описание проблемы, как выше.

EDIT: На самом деле, это, вероятно, больше проблема отсутствия большого количества кода с точки зрения этой конкретной проблемы.

У меня есть таблица 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 
} 

Таким образом, я добавляю целые строки редактируемых текстовых полей. Мне нужен способ повлиять на значения 6-го столбца TextBox выбранной строки и 5-го столбца TextBox выбранной строки + 1.

EDIT2: Я пробовал грязный вариант, чтобы посмотреть, как он пойдет и как-то сравнение внутри if ломает приложение. Компилятор обнаруживает исключение nullpointer, и я не могу даже отлаживать его с помощью контрольных точек, потому что он не может скомпилироваться и не запускаться. Однако я не могу понять, почему. Я бросил код непосредственно в мероприятие для тестирования, поэтому прошу прощения за уродство.

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

На самом деле вы можете привести пример кода, который работает, не отрывая деловые секреты.Показывать, что вы сделали, очень помогло бы. – Tobika

ответ

0

EDIT: Так как вы редактировали Ваш вопрос, и вы не хотите использовать EventBus вы могли перебрать вашей FlexTable и установите значение TextBox в зависимости от текущей RowIndex и cellIndex ... Его не хорошо, но это должно работать:

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

     } 
    } 

} 

Я по-прежнему рекомендую использовать eventbus. Чтобы сделать его еще более удобным, есть GWT Event Binder lib, что делает использование событий ветерок.

Поэтому, когда вы меняете значение в своем текстовом поле [2,5], оно также запускает ваш CustomEvent. Все виджеты, которым нужно изменить их значение в текстовом поле, просто нужно поймать ...

+0

Медведь со мной, это буквально в первый раз, когда я пытаюсь сделать и понять слушателя событий, который еще не встроен. Я думаю, что я понимаю основную структуру настраиваемого события и виджета, но то, что я не могу понять, - это то, как событие должно знать, что оно должно изменить только один конкретный текстовый блок, а не все из них. Как событие, которое происходит в textBox [1,6], будет знать, что влияет только на textBox [2,5], как textBox [2,6] будет знать только, чтобы повлиять на textBox [3,6] и т. Д. Также я не конечно, если я даже смогу использовать пользовательскую библиотеку, если у меня не будет другого решения? – BadAyka

+0

EventBinder в основном является оберткой для встроенного EventBus для уменьшения шаблона (http://www.gwtproject.org/javadoc/latest/com/google/gwt/event/shared/EventBus.html). Самый простой способ отличить, к какому событию должен прослушиваться TextBox, - создавать разные события для каждого из них. Например: 'TextBox1ChangedEvent' и' TextBox2ChangedEvent'. Если значение 'TextBox1' изменяет, оно вызывает« TextBox1ChangedEvent ». Все остальные текстовые заметки, которые вы хотите прослушать, будут реализовывать 'void onEvent (событие TextBox1ChangedEvent)' и реагировать на него – Tobika

+0

Я добавил надежное более быстрое и грязное решение – Tobika

 Смежные вопросы

  • Нет связанных вопросов^_^