2016-10-27 9 views
0

OK]をので、私は、かなり具体的で、私には非常に複雑な問題を持っています。他のウィジェットの値が変更されたときに、GWTフレックステーブル内のウィジェットの値を変更しますか?私はGWTの初心者だとして

私は動的にその細胞がGWTウィジェットを含む行を、追加するために使用され、GWTのフレックステーブルを持っています。行番号は変更されますが、静的な列の数は常に6です。各行には、削除ボタンが付いたセルと、それぞれに独自のテキストボックスを持つ5つのセルが含まれています。

私は何をする必要があり、コードは、1行分のセル6にテキストボックスとの間の関係の種類と次の行(またはその逆)のセル5のテキストボックス何とかあります。

説明するために:何かが[1,6]、[2,5]でテキストボックスの内容が同じ値で上書きする必要があるでテキストボックスに変化したとき。 [2,5]のテキストボックスが変更された場合、[1,6]のテキストボックスも同様に変更する必要があります。私はそれが特定のアクションを実行するユーザーを必要としない、onValueChangeまたはブラーまたは類似した何かを経由して発生する必要があり、変更をコミットするために、ボタンを使用することはできません。

私の問題は、ほとんどがフレックステーブルとその内容に特定のセルに対処する方法を把握しようとしているから茎。ボタンを削除するには、クリックイベントハンドラを使用するだけで問題は解決しましたが、この問題ではソリューションを思いつくことができません。それはビジネスの秘密ですので、

悲しいことに、私はまた、私が今まで持っていたコードのいずれかを提供することはできません。私は上記のような問題の幅広い説明のみを与えることができます。

EDIT: 実際に、それはおそらく、この特定の問題の面で多くのコードを持っていないのより多くの問題です。私は何

は最初のみヘッダ行を有し、フレックステーブルです。この表の下のボタンをクリックすると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の値に影響を及ぼす方法です。

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

...キャッチする必要があります。あなたがしたことが大いに助けてくれることを示してください。 – Tobika

答えて

0

EDIT:あなたは、あなたの質問を編集し、あなたがあなたのFlexTableを反復して、現在のrowIndexプロパティとcellIndexに応じて、あなたのTextBox値を設定することができEventBusを使用したくないので...その素敵ではないが、それは動作するはずです:

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 libがあります。これにより、イベントを簡単に使用できます。

あなたのテキストボックスに値を変更するときに、[2,5]それはまたあなたのCustomEventを発射。そのテキストボックスの値を変更する必要があるすべてのウィジェットは、ちょうど実際にあなたがビジネスの秘密を配っせずに動作するコードの例を与えることができ

+0

私と一緒にいらっしゃいましたが、それは文字通り、組み込みではないイベントリスナーを作成して理解しようとしています。私はカスタムイベントとウィジェットの基本的な構造を理解していると思いますが、把握できないのは、イベントがどの特定のtextBoxだけを変更し、それらのすべてを変更するべきでないかを知る方法です。テキストボックス[1,6]で発生するイベントは、テキストボックス[2,5]だけに影響することを知っているでしょう、どのようにテキストボックス[2,6]がテキストボックス[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 event)'を実装してそれに反応します。 – Tobika

+0

私はうまくいけば簡単に素早く汚れた解決策を追加しました – Tobika

関連する問題