Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

PrimeFacesのコンポーネントをプログラムから制御する

PrimeFacesのコンポーネントは基本的にjavax.faces.component.UIComponentクラスを継承して作成されているため、通常の画面コンポーネント同様にプログラムでも色々と操作することができます。

コンポーネントJSFのビューで定義されたID属性値をキーに取得できるので、例えば以下のようなメソッドを用意して、引数にIDを指定すれば、画面コンポーネントのオブジェクトが取得できます。

public UIComponent findComponent(String componentId){
    FacesContext currentInstance = FacesContext.getCurrentInstance();
    return currentInstance.getViewRoot().findComponent(componentId);
}

あとは色々(^^;

CommandLinkを無効にしたり
CommandLink link = (CommandLink) findComponent(":xxxFrm:lnkyyy");
if(link != null){
    link.setDisabled(true);
}
Panelを非表示にしたり
Panel menuPanel = (Panel) findComponent(":xxxFrm:pnlYyy");
if(menuPanel != null){
    menuPanel.setVisible(false);
}
EL式を書き換えたり
public void changeSomethingEl(){
    String elExpression = "#{" + "xxxBean" + ".setYyyInfo(zzzBean.selectedData)}";
    CommandLink lnk = (CommandLink)findComponent(":frm:dt:lnkSelect");
    if(lnk != null){
        lnk.setActionExpression(getElActionExpression(elExpression));
        lnk.saveState(FacesContext.getCurrentInstance());
    }
}

public MethodExpression getElActionExpression(String elExp){
    FacesContext currentInstance = FacesContext.getCurrentInstance();
    ELContext elCtx = currentInstance.getELContext();
    ExpressionFactory expFact = currentInstance.getApplication().getExpressionFactory();
    return expFact.createMethodExpression(elCtx, elExp, String.class, new Class[]{String.class});
}

上記ではimport文を省いてますが各々

  • org.primefaces.component.commandlink.CommandLinkのCommandLink
  • org.primefaces.component.panel.PanelのPanel

です。

JSFコンポーネントベースだし、プログラムでも書けるので、WindowsForm開発してた自分にはわりとなじみやすい感じがしてます…(^^;

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村