- PR -

JSFのdatatableで特定の行だけ色を変える

投稿者投稿内容
935
会議室デビュー日: 2005/01/14
投稿数: 13
投稿日時: 2005-01-14 19:33
datatableで特定の行の背景、文字の色を変更したいのですが、ご教授ください。
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2005-01-14 23:14
単にCSS使えばいいだけだと思います。
ID属性とかCLASS属性を利用してCSSでそうできるような
htmlをはき出せるように書くだけです。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-01-19 14:14
標準セットではできそうもありませんね.
特定行のスタイル(背景色や文字色)をプログラムで与えてよいのであれば,カスタムレンダラを作ればできそうです.
もともとrowStylesという,行ごとにスタイルを周期的に変更する機能があって,これを実装しているのはcom.sun.faces.renderkit.html_basic.TableRenderer.encodeChildrenというメソッドなので,TableRendererのサブクラスを作ってこのメソッドをオーバーライドすればいいと思います.

背景色や文字色をタグで指定できるようにするには,さらにカスタムタグを定義すれば良く,これはそんなに難しくないと思います.
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-01-20 19:21
標準セットではできそうもない,と言いましたが,こんなんで良ければ:

<h:dataTable value="#{example.lines}" var="line">
<h:column>
<h:inputText value="#{line.text}" style="#{line.style}"/>
</h:column>
</h:dataTable>

ここでLine.java:
public String getStyle() {
if (text != null && text.length() > 5) {
return "color: red";
} else {
return "";
}
}

こうすると,6文字以上入力した行は赤くなりましたけど.

本格的にやろうとすると,アプリケーション側のコーディングがJSP/HTMLをかなり意識したやっかいなコーディングになりそうだし,JSPページ側でスタイルを指定できないので,あんまり好ましいとは思いませんが.
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2005-01-20 20:16
こんな感じでいけませんか?

コード:
<c:if test="${hoge.hoge == 'USA'}">
    <div id="fuga">${customer}</div>
</c:if>

よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-01-21 19:23
<h:column>
<c:if test="${line.text == 'USA'}">
<div id="fuga">....</div>
</c:if>
</h:column>
のような感じにできないか?ということですか?

<h:column>と</h:column>の間には<c:if>どころか,プレインテキストすら入れられません.
繰り返し処理がJSFのコンポーネントしか扱えないからです.
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-01-24 10:14
しつこいですが,再度!

「JSPページ側でスタイルを指定できない」と言いましたが,こんな書き方もできますね.

まずLine.java:
public String getType() {
 if (text != null && text.length() > 5) {
  return "long";
 } else {
  return "short";
 }
}
と用意しておきます.そして
<h:dataTable value="#{example.lines}" var="line">
<h:column>
<h:inputText value="#{line.text}"
   style="#{line.type == 'long'?'color:red':''}"/>
</h:column>
</h:dataTable>

?:構文がちょっとトリッキーです.これを避ける方法も考えました.
faces-config.xmlで
<managed-bean>
<managed-bean-name>styleMap</managed-bean-name>
<managed-bean-class>java.util.HashMap</managed-bean-class>
<map-entries>
<map-entry>
<key>long</key><value>color:red</value>
</map-entry>
<map-entry>
<key>short</key><value></value>
</map-entry>
</map-entries>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
のように用意しておけば
<h:dataTable value="#{example.lines}" var="line">
<h:column>
<h:inputText value="#{line.text}" style="#{styleMap[line.type]}"/>
</h:column>
</h:dataTable>
と書けます.faces-config.xmlはJSPページ側の資産であるという前提ですが.
935
会議室デビュー日: 2005/01/14
投稿数: 13
投稿日時: 2005-02-01 16:09
aaさん、よしだひろゆきさん、ありがとうございました。
cssと、datatableのrowclassesにBeanのカラムを指定し、実現することができました。

スキルアップ/キャリアアップ(JOB@IT)