shinsanです。
"Hideo Konishi" <
h-konishi@...> wrote:
> たとえば1列目をハイパーリンクにし、これを押した場合、詳細ページに飛ぶという
> 処理をいれるとします。上述の方法で1列目と2列目のデータを入れ替えた場合、
> 1列目のデータは2列目に移動しますが、ハイパーリンクは1列目のままです。
> ハイパーリンクも2列目に移動させるには、tableRowGroup.getChildren()
> を入れ替えてやる以外に方法がないように思われます。
>
> 何かいい方法がありますでしょうか?
最初にほしい機能としてあげられたヘッダテキストや各種プロパティの変更だけなら
先ほどの方法で変更できます。
ただし、このaddする方法でも問題となった最初の表示は変更できないと思うのですが、
どうでしょうか?2回目以降は問題がないのは分りますが。
カラムのコンポーネントの動的な変更はこのままでは無理です。TableRowGroupを空に
して追加することが必要となります。
念のために軽くwoodstock(VisualWebで使用するコンポーネントライブラリ)とmojarra
(JSFの実装)のソースを追ってみました。
woodstock側ではTableRowGroup、TableRowGroupBaseともに処理はしていませんでした。
継承元のJSF側を見てみます。
UIComponentBaseの中にあるstatic でprivate なChildrenListというのが
ArrayList<UIComponent>を継承したクラスがコンポーネントの順序等を保持するクラス
のようです。
ここのaddメソッドを見ると以下のように書かれています。
public boolean add(UIComponent element) {
if (element == null) {
throw new NullPointerException();
} else {
eraseParent(element);
element.setParent(component);
return (super.add(element));
}
}
そしてeraseParentの抜粋です
private static void eraseParent(UIComponent component) {
UIComponent parent = component.getParent();
if (parent == null) {
return;
}
if (parent.getChildCount() > 0) {
List children = parent.getChildren();
int index = children.indexOf(component);
if (index >= 0) {
children.remove(index);
return;
}
}
自分の親をセットする前に親の中にそのコンポーネントが存在すれば一度削除をして
追加をしているようです。
ですから、順序を指定して順番にaddをするということ自体は問題ないのが分ります。
他の追加系やset等も同様です。
30回addをすればすべてソートされるはずです。
やはり、2回目以降(isPostback() == true)ならば問題ないですね。
でも一番最初の問題としてあげられた1回目の変更はできません。
1回目からやるためにはTableRowGroupを空っぽにしておく必要があります。
---------------------------------------------------------------------
To unsubscribe, e-mail:
nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail:
nbdiscuss_ja-help@...