|
View:
New views
10 Messages
—
Rating Filter:
Alert me
|
|
|
VWPの表にてヘッダ文字を動的に設定する方法お世話になります。小西といいます。
VWPとオラクルにてWebアプリケーションを開発しています。 表のヘッダ文字を動的に設定したいのですが、うまくいかないので困っています。 ヘッダに文字を設定するタイミングはprerenderイベントで行っています。 prerender()では以下のようにtableRowGroupから関連づいているカラム情報を リストで取得し、設定をしています。 ---------------------------------------------------------- prerender() //テーブルカラム配列を取得 List list=tableRowGroup.getChildren(); //配列をループしてヘッダテキストに文字列を設定 for (int i = 0; i < list.size(); i++) { //テーブルカラム情報の取得 tableColumn = (TableColumn)list.get(i); //ヘッダ文字の設定 //arrayにはあらかじめ文字列が設定されています tableColumn.setHeaderText(array[i];); } ---------------------------------------------------------- �ただし、画面をはじめて起動した際のprerenderでは、tableRowGroup.getChildren()には まだテーブルカラム情報が設定されていない為、ヘッダ文字列を設定できませんでした。 �画面起動、実行などのボタンを押すと、画面が再描画されますが、その際のprerenderでは tableRowGroup.getChildren()にカラム情報が設定されているためヘッダが設定できます。 �tableRowGroup.getChildren()に値が設定されるタイミングを調べたところ、 上記�では設定されず、上記�にて,まずpreprocess()が走り、そこでResultSetPropertyResolver.setValue がよばれて設定されているよう でした。これは何が呼んでいるのかはソースが存在しないため調べることが出来ませんでした。 .�表を動的に生成するというHPがあったので、最終的にはそうしないといけないのかなあと思っていますが、バインド 関係もすべて作成するのも手間がかかるので他にいい方法がないか調べています。 �もし何かいい方法を知っておられる方がいらっしゃいましたらお教えいだだけるでしょうか?。 よろしくお願いします。 ---------------------------------------------------------------------- ・環境 netbeans-5_5_1-windows-ja netbeans-visualweb-5_5_1 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: VWPの表にてヘッダ文字を動的に設定する方法shinsanです。
表のカラム数が動的に変わるということでしょうか? それともヘッダテキストのみが変わるということでしょうか? 後者ならばデザイナ上でバリューバインドしておいて、prerender()メソッド内で動的 にそのプロパティをかえることがやはり無難です。 また、カラムも5.5.1ならばデフォルトでコンポーネントバインディングしてあります のでそれを使う方法もあります。6.1ならばバインド設定をしてあげる必要があります。 TableColumn columns[]={ tableColumn1 , tableColumn2 … }; int i=0; for(TableColumn col : columns){ col.setHeaderText("カラム:"+ i++ ); } 注意したいのは配列を使ったバリューバインディングを作るとプロパティ等を触った 瞬間に右下に例外のマークが出ることです。これは6.1になっても直っていないようです。 6.1のスタックトレースは以下のようになりますが、従来のバージョンでも同じです。 java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1938) at org.netbeans.modules.visualweb.propertyeditors.binding.data.BindValueToDataProviderPanel.updateDataProvider(BindValueToDataProviderPanel.java:266) at org.netbeans.modules.visualweb.propertyeditors.binding.data.BindValueToDataProviderPanel$1.run(BindValueToDataProviderPanel.java:184) [catch] at java.lang.Thread.run(Thread.java:619) JSFとしては普通に正しいものだと思いますし、実行しても問題は見つかりません。 あとtableRowGroupは1回目はデータのあるなしにかかわらずからっぽのはずです。 ですから1回目でgetChildren()でまわすのは無理です。 "Hideo Konishi" <h-konishi@...> wrote: > お世話になります。小西といいます。 > > VWPとオラクルにてWebアプリケーションを開発しています。 > 表のヘッダ文字を動的に設定したいのですが、うまくいかないので困っています。 > > ヘッダに文字を設定するタイミングはprerenderイベントで行っています。 > prerender()では以下のようにtableRowGroupから関連づいているカラム情報を > リストで取得し、設定をしています。 > > ---------------------------------------------------------- > prerender() > > //テーブルカラム配列を取得 > List list=tableRowGroup.getChildren(); > //配列をループしてヘッダテキストに文字列を設定 > for (int i = 0; i < list.size(); i++) { > //テーブルカラム情報の取得 > tableColumn = (TableColumn)list.get(i); > //ヘッダ文字の設定 > //arrayにはあらかじめ文字列が設定されています > tableColumn.setHeaderText(array[i];); > } > ---------------------------------------------------------- > > �ただし、画面をはじめて起動した際のprerenderでは、tableRowGroup.getChildren()には > まだテーブルカラム情報が設定されていない為、ヘッダ文字列を設定できませんでした。 > > > > > �画面起動、実行などのボタンを押すと、画面が再描画されますが、その際のprerenderでは > tableRowGroup.getChildren()にカラム情報が設定されているためヘッダが設定できます。 > > �tableRowGroup.getChildren()に値が設定されるタイミングを調べたところ、 > 上記�では設定されず、上記�にて,まずpreprocess()が走り、そこでResultSetPropertyResolver.setValue > がよばれて設定されているよう > でした。これは何が呼んでいるのかはソースが存在しないため調べることが出来ませんでした。 > > .�表を動的に生成するというHPがあったので、最終的にはそうしないといけないのかなあと思っていますが、バインド > 関係もすべて作成するのも手間がかかるので他にいい方法がないか調べています。 > > �もし何かいい方法を知っておられる方がいらっしゃいましたらお教えいだだけるでしょうか?。 > > よろしくお願いします。 > > ---------------------------------------------------------------------- > ・環境 > netbeans-5_5_1-windows-ja > netbeans-visualweb-5_5_1 > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > > > __________ NOD32 3084 (20080508) Information __________ > > This message was checked by NOD32 antivirus system. > http://canon-sol.jp/product/nd > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
|
|
|
Re: VWPの表にてヘッダ文字を動的に設定する方法とりあえず解決しましたのでお知らせします。
1回目のprerenderではtableRowGroup.getChildren()に値が設定されていませんでしたが、 tableRowGroup.getChildren()に自分でテーブルカラム(tableColumn1 , tableColumn2 )を addすることで値を設定することができ、その後tableRowGroup.getChildren()をループすることで ヘッダ文字列を設定できました。 (tableRowGroup.getChildren()を使用するのに固執した理由として、既に以下の様に表のプロパティを設定するメソッドを作成し、 ヘッダ文字列、並び順、Visible,widthを設定させるようにしていた為です)。 //Propertyはヘッダ文字列、並び順、Visible,width等をフィールドに持つクラス SetTableProperty(TableRowGroup tableRowGroup, Property property)} //反映・・・ } なお、今回tableRowGroup.getChildren()にaddする順で表示列順を変更できることがわかり、列の動的変更の機能も SetTablePropertyに追加することができました。 現状問題なく動いているようですが、強制的にtableRowGroup.getChildren()に値を設定しているので 何か問題があるかもしれませんが・・・ いろいろと情報ありがとうごうざいました。 ----- Original Message ----- From: "Hideo Konishi" <h-konishi@...> To: <nbdiscuss_ja@...> Sent: Friday, May 09, 2008 9:13 AM Subject: Re: [nbdiscuss_ja] VWPの表にてヘッダ文字を動的に設定する方法 > 情報ありがとうございます。 > > >> 表のカラム数が動的に変わるということでしょうか? > カラム数は30と固定です。ただしその並び順は1〜30とはかぎりません。 > > >> それともヘッダテキストのみが変わるということでしょうか? > ヘッダテキスト以外にもプロパティの動的設定は行っていますが、 > 今回はヘッダテキストの例で質問をしました。 > > >> TableColumn columns[]={ >> tableColumn1 , tableColumn2 … >> }; >> >> int i=0; >> for(TableColumn col : columns){ >> col.setHeaderText("カラム:"+ i++ ); >> } > > 私も上記のように自分でカラム配列を作成する方向で考えていました。 > > ただ私のアプリでは、テーブルカラムを、デザイナ上でバリューバインドする際、列順を入れ替えています。 > また、ヘッダ情報配列はその順番で配列に治めています。 > したがって、columns[]を定義する際、1〜30と並べるのではなく、バリューバインドした列順と > 同じ順で指定してやる必要があります。 > > バリューバインドの設定と上記の配列定義を同じにすればよいのですが、 > ソースの保守性を高めたいので同じ情報を2箇所で持たしたくないと思っています。 > > > したがって、バインドした情報から上記の配列を動的に作成する方法が何かないかと今調査しているところです。 > (ちなみにtableRowGroup.getChildren();で得られるリストはバリューバインドした際の列順と同じのため > 使いやすかったのですが・・・) > > > ありがとうございました。自分でももう少し調べてみます。 > > ----- Original Message ----- > From: "shin" <shinsan@...> > To: <nbdiscuss_ja@...> > Sent: Thursday, May 08, 2008 6:07 PM > Subject: Re: [nbdiscuss_ja] VWPの表にてヘッダ文字を動的に設定する方法 > > >> shinsanです。 >> >> 表のカラム数が動的に変わるということでしょうか? >> それともヘッダテキストのみが変わるということでしょうか? >> >> 後者ならばデザイナ上でバリューバインドしておいて、prerender()メソッド内で動的 >> にそのプロパティをかえることがやはり無難です。 >> >> >> また、カラムも5.5.1ならばデフォルトでコンポーネントバインディングしてあります >> のでそれを使う方法もあります。6.1ならばバインド設定をしてあげる必要があります。 >> >> TableColumn columns[]={ >> tableColumn1 , tableColumn2 … >> }; >> >> int i=0; >> for(TableColumn col : columns){ >> col.setHeaderText("カラム:"+ i++ ); >> } >> >> >> 注意したいのは配列を使ったバリューバインディングを作るとプロパティ等を触った >> 瞬間に右下に例外のマークが出ることです。これは6.1になっても直っていないようです。>> 6.1のスタックトレースは以下のようになりますが、従来のバージョンでも同じです。>> java.lang.StringIndexOutOfBoundsException: String index out of range: -1>> at java.lang.String.substring(String.java:1938)>> atorg.netbeans.modules.visualweb.propertyeditors.binding.data.BindValueToDataProviderPanel.updateDataProvider(BindValueToDataProviderPanel.java:266)>> atorg.netbeans.modules.visualweb.propertyeditors.binding.data.BindValueToDataProviderPanel$1.run(BindValueToDataProviderPanel.java:184)>> [catch] at java.lang.Thread.run(Thread.java:619)>>>> JSFとしては普通に正しいものだと思いますし、実行しても問題は見つかりません。>>>>>> あとtableRowGroupは1回目はデータのあるなしにかかわらずからっぽのはずです。>> ですから1回目でgetChildren()でまわすのは無理です。>>>>>> "Hideo Konishi" <h-konishi@...> wrote:>>>>> お世話になります。小西��といいます。>>>>>> VWPとオラクルにてWebアプリケーションを開発しています。>>> 表のヘッダ文字を動的に設定したいのですが、うまくいかないので困っています。>>> ヘッダに文字を設定するタイミングはprerenderイベントで行っています。>>> prerender()では以下のようにtableRowGroupから関連づいているカラム情報を>>> リストで取得し、設定をしています。>>>>>> ---------------------------------------------------------->>> prerender()>>>>>> //テーブルカラム配列を取得>>> List list=tableRowGroup.getChildren();>>> //配列をループしてヘッダテキストに文字列を設定>>> for (int i = 0; i < list.size(); i++) {>>> //テーブルカラム情報の取得>>> tableColumn = (TableColumn)list.get(i);>>> //ヘッダ文字の設定>>> //arrayにはあらかじめ文字列が設定されています>>> tableColumn.setHeaderText(array[i];);>>> }>>> ----------------------! etbeans.org> --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: VWPの表にてヘッダ文字を動的に設定する方法shinsanです。
すみません、ちょっとここが気になりました。 > tableRowGroup.getChildren()に自分でテーブルカラム(tableColumn1 , > tableColumn2 )を > addすることで値を設定することができ、その後tableRowGroup.getChildren()をループすることで 自前でaddするコードがあるということはその順番を処理しているため、先ほどの 並び順を配列なりリストなりで保持するのとなんら変わらないように見えます。 "Hideo Konishi" <h-konishi@...> wrote: > とりあえず解決しましたのでお知らせします。 > > > 1回目のprerenderではtableRowGroup.getChildren()に値が設定されていませんでしたが、 > tableRowGroup.getChildren()に自分でテーブルカラム(tableColumn1 , > tableColumn2 )を > addすることで値を設定することができ、その後tableRowGroup.getChildren()をループすることで > ヘッダ文字列を設定できました。 > (tableRowGroup.getChildren()を使用するのに固執した理由として、既に以下の様に表のプロパティを設定するメソッドを作成し、 > ヘッダ文字列、並び順、Visible,widthを設定させるようにしていた為です)。 > > //Propertyはヘッダ文字列、並び順、Visible,width等をフィールドに持つクラス > SetTableProperty(TableRowGroup tableRowGroup, Property property)} > //反映・・・ > } > > なお、今回tableRowGroup.getChildren()にaddする順で表示列順を変更できることがわかり、列の動的変更の機能も > SetTablePropertyに追加することができました。 > > > 現状問題なく動いているようですが、強制的にtableRowGroup.getChildren()に値を設定しているので > 何か問題があるかもしれませんが・・・ > > いろいろと情報ありがとうごうざいました。 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
|
|
|
Re: VWPの表にてヘッダ文字を動的に設定する方法shinsanです。
例のコードでも両方は直す必要はないです。 並び順はデザイナで一度設定したもののままでいいです。 あくまでも、バインド先のデータとヘッダを並び替えさえすればaddするコードと 何も変わらないのでは?ということです。 JSFはコンポーネントの動的変更をしたりするとゴーストイベントが発生したり リストアフェーズで失敗することも多いので注意ですね。 JTableのソートのようにモデルをそのまま使わせるのではなく、表示用に アダプタをかませるほうがコード的に柔軟になりやすいのかな?と思いましたので。 "Hideo Konishi" <h-konishi@...> wrote: > > 自前でaddするコードがあるということはその順番を処理しているため、先ほどの > > 並び順を配列なりリストなりで保持するのとなんら変わらないように見えます。 > > 並び順が変更された場合、定義したリストの並び順と、デザイナでの並び順の両方を > 直さないといけないのが面倒なので、tableRowGroup.getChildren()に追加して、 > デザイナの変更をおこなわないでいいようにしています。 > > > > > > > > ----- Original Message ----- > From: "shin" <shinsan@...> > To: <nbdiscuss_ja@...> > Sent: Saturday, May 10, 2008 1:10 PM > Subject: Re: [nbdiscuss_ja] VWPの表にてヘッダ文字を動的に設定する方法 > > > > shinsanです。 > > > > すみません、ちょっとここが気になりました。 > > > >> tableRowGroup.getChildren()に自分でテーブルカラム(tableColumn1 , > >> tableColumn2 )を > >> addすることで値を設定することができ、その後tableRowGroup.getChildren()をループすることで > > > > 自前でaddするコードがあるということはその順番を処理しているため、先ほどの > > 並び順を配列なりリストなりで保持するのとなんら変わらないように見えます。 > > > > > > > > "Hideo Konishi" <h-konishi@...> wrote: > > > >> とりあえず解決しましたのでお知らせします。 > >> > >> > >> 1回目のprerenderではtableRowGroup.getChildren()に値が設定されていませんでしたが、 > >> tableRowGroup.getChildren()に自分でテーブルカラム(tableColumn1 , > >> tableColumn2 )を > >> addすることで値を設定することができ、その後tableRowGroup.getChildren()をループすることで > >> ヘッダ文字列を設定できました。 > >> (tableRowGroup.getChildren()を使用するのに固執した理由として、既に以下の様に表のプロパティを設定するメソッドを作成し、 > >> ヘッダ文字列、並び順、Visible,widthを設定させるようにしていた為です)。 > >> > >> //Propertyはヘッダ文字列、並び順、Visible,width等をフィールドに持つクラス > >> SetTableProperty(TableRowGroup tableRowGroup, Property property)} > >> //反映・・・ > >> } > >> > >> なお、今回tableRowGroup.getChildren()にaddする順で表示列順を変更できることがわかり、列の動的変更の機能も > >> SetTablePropertyに追加することができました。 > >> > >> > >> 現状問題なく動いているようですが、強制的にtableRowGroup.getChildren()に値を設定しているので > >> 何か問題があるかもしれませんが・・・ > >> > >> いろいろと情報ありがとうごうざいました。 > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > > For additional commands, e-mail: nbdiscuss_ja-help@... > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > > > __________ NOD32 3090 (20080509) Information __________ > > This message was checked by NOD32 antivirus system. > http://canon-sol.jp/product/nd > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
|
|
|
Re: VWPの表にてヘッダ文字を動的に設定する方法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@... |
|
|
|