2016-10-27 1 views
0

Ok, donc j'ai un problème assez spécifique et pour moi assez compliqué, car je suis un débutant GWT.Modifier la valeur du widget dans la table GWT flex lorsque la valeur d'un autre widget change?

J'ai une table flexible GWT, que j'utilise pour ajouter dynamiquement des lignes, dont les cellules contiennent des widgets GWT. Le numéro de ligne change, mais le nombre de colonnes est statique, toujours 6. Chaque ligne contient une cellule avec un bouton Supprimer et cinq cellules avec leur propre zone de texte. Ce que je dois faire est en quelque sorte de coder un type de relation entre la zone de texte dans la cellule 6 d'une ligne et la zone de texte dans la cellule 5 dans la ligne suivante (et vice versa). Pour illustrer ceci: lorsque quelque chose change dans la zone de texte [1,6], le contenu de la zone de texte [2,5] doit être remplacé par la même valeur. Si la zone de texte à [2,5] change, la zone de texte à [1,6] doit également être modifiée. Je ne peux pas utiliser un bouton pour valider les modifications, cela doit se faire via onValueChange ou Blur ou quelque chose de similaire, ce qui ne nécessite pas que l'utilisateur effectue une action spécifique. Mon problème provient principalement d'essayer de comprendre comment adresser des cellules spécifiques dans la table flex et leur contenu. Pour le bouton de suppression, la solution était assez facile avec un gestionnaire d'événement click, mais pour ce problème, je n'arrive pas à trouver une solution. Malheureusement, je ne peux pas non plus fournir le code que j'ai jusqu'à présent, car c'est un secret d'affaires. Je ne peux donner qu'une description générale du problème comme celle ci-dessus.

EDIT: En fait, c'est probablement plus un problème de ne pas avoir beaucoup de code en termes de ce problème spécifique.

Ce que j'ai est une table flexible, qui a initialement seulement la ligne d'en-tête. En cliquant sur un bouton en dessous de cette table, la méthode addNewField() est appelée, qui contient uniquement la création, la définition des valeurs par défaut et l'ajout des champs de texte dans une nouvelle ligne.

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 
} 

De cette façon, j'ajoute des lignes entières de TextBox modifiables. Ce dont j'ai besoin est un moyen d'influencer les valeurs de la 6ème colonne TextBox d'une ligne choisie et la 5ème colonne TextBox de la ligne choisie + 1.

EDIT2: J'ai essayé l'option sale juste pour voir comment ça irait et en quelque sorte la comparaison à l'intérieur de la si casse l'application. Le compilateur détecte une exception nullpointer et je ne peux même pas le déboguer avec des points d'arrêt car il échoue à compiler et ne démarre pas. Je ne peux pas comprendre pourquoi cependant. J'ai jeté le code directement dans l'événement à des fins de test, alors pardonnez la laideur.

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

En fait vous pouvez donner un exemple de code qui fonctionne sans dévoiler des secrets d'affaires.Montrer ce que vous avez fait aiderait énormément – Tobika

Répondre

0

EDIT: Depuis que vous avez modifié votre question et vous ne voulez pas utiliser EventBus vous pouvez itérer sur votre FlexTable et de définir votre valeur TextBox en fonction de votre rowIndex actuelle et cellIndex ... Ce ne est pas agréable, mais il devrait fonctionner:

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

     } 
    } 

} 

Je recommande toujours l'utilisation d'un bus d'événement. Pour le rendre encore plus pratique, il y a le GWT Event Binder lib, ce qui rend l'utilisation des événements un jeu d'enfant. Par conséquent, lorsque vous modifiez une valeur dans votre zone de texte [2,5], elle déclenche également votre CustomEvent. Tous les Widgets, qui ont besoin de changer leur valeur de zone de texte doivent juste attraper ...

+0

Ours avec moi, c'est littéralement ma première fois à essayer de créer et de comprendre un écouteur d'événement qui n'est pas déjà intégré. Je pense que je comprends la structure de base de l'événement personnalisé et du widget, mais ce que je n'arrive pas à saisir, c'est comment l'événement sait qu'il ne devrait changer qu'un seul textBox spécifique et pas tous. Comment l'événement qui se passe à textBox [1,6] ne devrait affecter que textBox [2,5], comment textBox [2,6] ne connaîtrait que pour affecter textBox [3,6] etc Aussi je ne suis pas Bien sûr, je serai même capable d'utiliser une bibliothèque personnalisée, si je ne veux pas y at-il une autre solution? – BadAyka

+0

Le composant EventBinder n'est en fait qu'un wrapper pour le composant EventBus intégré afin de réduire le problème (http://www.gwtproject.org/javadoc/latest/com/google/gwt/event/shared/EventBus.html). Le moyen le plus simple de différencier l'événement auquel TextBox doit répondre est de créer des événements différents pour chacun d'entre eux. Par exemple: 'TextBox1ChangedEvent' et' TextBox2ChangedEvent'. Si la valeur de 'TextBox1' change, elle déclenche le' TextBox1ChangedEvent'. Tous les autres TextBox que vous voulez écouter vont implémenter 'void onEvent (Evénement TextBox1ChangedEvent)' et y réagir – Tobika

+0

J'ai ajouté une solution rapide et sale, je l'espère – Tobika