Locked History Actions

Diff for "GWT/Widget/FlexTable"

Differences between revisions 1 and 2
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
== レイアウト上のバグ == == レイアウト上のバグとの対策 ==

=== 現象 ===
Line 25: Line 27:
=== 原因 ===
Line 41: Line 45:
=== 対策 ===

FlexTableをそのまま使う上での対策としては、(この例の場合では)プログラマ側が、どの列が一つ多くなっているかを認識し、その列より右側の列位置を指定する再に、列インデックスを減産するというものである。しかしこれはいかにも面倒であろう。

FlexTable

レイアウト上のバグとの対策

現象

FlexTableには非常に大きなバグがある。しかし、FlexTableの構造上、不可避のものなので「仕様」と言ってもよいかもしれない。

例えば以下のコードを実行すると、Bはなぜか2列目にはならず、三列目になってしまう。 つまり、(0,0)位置のセルのRowSpanを2にすると、二行目の列位置がずれてしまう。

    FlexTable table = view.getFlexTable();    
    table.setText(0, 0, "X");
    table.getFlexCellFormatter().setRowSpan(0,  0, 2);    
    table.setText(0,  1, "A");
    table.setText(1,  1, "B");

以下のように、後から(0,0)位置のセルを入れても同じ現象になる。

    FlexTable table = view.getFlexTable();    
    table.setText(0,  1, "A");
    table.setText(1,  1, "B");
    table.setText(0, 0, "X");
    table.getFlexCellFormatter().setRowSpan(0,  0, 2);     

原因

これは、実際に生成されるtableタグでの解釈と、FlexTableでのセル位置指定にズレがあるからである。 例えば、上の例の場合、いずれも

<tr>
 <td rowspan="2">X</td>
 <td>A</td>
</tr>
<tr>
  <td></td>
  <td><B</td>
</tr>

というタグが生成される。FlexTable側としては指示された場所にデータを入れているつもりだろうが、 tableタグの解釈としては、これはプログラマの意図とは異なるものになってしまう。 つまり、AとBは同じ列にはならない。

対策

FlexTableをそのまま使う上での対策としては、(この例の場合では)プログラマ側が、どの列が一つ多くなっているかを認識し、その列より右側の列位置を指定する再に、列インデックスを減産するというものである。しかしこれはいかにも面倒であろう。