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開発してた自分にはわりとなじみやすい感じがしてます…(^^;