在datatable內,有個GroupOn可以合併項目(rowspan),但是若是剛好那格是下拉選單要傳值收值,這時候~就會出現神奇的問題...假設是rowspan=3,雖然畫面只顯示一個,但實際上jsf他還是產生了三個,然後只顯示了第一個在上面....所以操作畫面,下拉變值,再怎麼改都只會改到一個而已~
那就會想到說要用 ValueChangeEvent 來讓他改一個也改其他兩個看不到的值。但因為jsf層級的問題,採用event.setPhaseId 來觸發其他值的變更~好像就可以的樣子...
但是~最好笑的就是~畫面輸入完麻後,重點總是要按送出(submit)才有意義阿~~
然後不知道........jsf的submit就是會去把所有的event全觸發一次....接著....他媽的就看到值又跳掉了阿阿阿阿阿~真的是改到翻桌(/-_-)/_|___|_...
花了很久的時間,一度還改成用Map來Group By那個輸入~但搞得是有點複雜,資料轉換多次很容易出錯~
後來終於想到一個比較簡單的方式...
重點就在於拿UIInput 來處理:
一是判斷是否為顯示(顯示的那個才是畫面操作變更到的那個),依此才改變層級切換值
一是傳入groupOn的資訊,這樣才會知道那些是要一起變動的資料
------jsp------
<datatable ....>
<ice:column groupOn="#{row.pid}">
<ice:selectOneMenu value="#{row.dtype}" valueChangeListener="#{bean.changeType}" partialSubmit="true">
<f:attribute name="pid" value="#{row.pid}" />
<f:selectItems value="#{bean.lstType}" />
</ice:selectOneMenu>
</ice:column>
------java------
import javax.faces.event.ActionEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.faces.component.UIInput;
public void changeType(ValueChangeEvent event) {
if(event == null || event.getNewValue() == null) {
return ;
}
if(((UIInput)event.getSource()).isRendered()) {
if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
return;
}
}
String pid = ((UIInput)event.getSource()).getAttributes().get("pid").toString();
String choose = (String)event.getNewValue();
....依相同的 reference id去更新 datatable model裡的dtype(choose)
}
2015年2月11日 星期三
2015年2月3日 星期二
java 利用enum 做參數設定
現在參數都流行用外部設定~
不過這次不想,就試著使用 enum 這種東西來定義看看~
先定義自訂項目的基本資訊~
public enum CustData {
Group("Group", true, "xxx");
private String pId;
private boolean isActive;
private String callMethod;
prviate Object cache;
private CustData(String id, boolean active, String callMethod) {
this.pId = id;
this.isActive = active;
this.callMethod = callMethod;
}
public String getPid() {
return pId;
}
public boolean isActive() {
return isActive;
}
public String getCallMethod() {
return callMethod;
}
public void setCache(Object obj) {
cache = obj;
}
public Object getCache() {
return cache;
}
}
在Pool裡Init時,就把相關的全讀進去~
其實偶想紀錄的重點只在 Object[] all = c.getEnumConstants();
總之就是取得所有定義的物件
Class c = Class.forName("mypackage.CustData");
Object[] all = c.getEnumConstants();
for(int i = 0 ; i < all.length ; i++) {
CustData cd = (mypackage.CustData)all[i];
Object obj = loadCustData(cd);
cd.setCache(obj);
.......
}
是說~用enum有什麼差別??...
修改彈性不太好(當然是比不上寫設定檔)
程式可讀性是高了點,因為可以定一些有意義的名稱,常數上應該是比較好看~
只是說,有時候做非開放式系統,也不用說什麼都做到設定檔上去,
有時候寫死增加別人偷code的難度,好像也是一種生存理論XD...
不過這次不想,就試著使用 enum 這種東西來定義看看~
先定義自訂項目的基本資訊~
public enum CustData {
Group("Group", true, "xxx");
private String pId;
private boolean isActive;
private String callMethod;
prviate Object cache;
private CustData(String id, boolean active, String callMethod) {
this.pId = id;
this.isActive = active;
this.callMethod = callMethod;
}
public String getPid() {
return pId;
}
public boolean isActive() {
return isActive;
}
public String getCallMethod() {
return callMethod;
}
public void setCache(Object obj) {
cache = obj;
}
public Object getCache() {
return cache;
}
}
在Pool裡Init時,就把相關的全讀進去~
其實偶想紀錄的重點只在 Object[] all = c.getEnumConstants();
總之就是取得所有定義的物件
Class c = Class.forName("mypackage.CustData");
Object[] all = c.getEnumConstants();
for(int i = 0 ; i < all.length ; i++) {
CustData cd = (mypackage.CustData)all[i];
Object obj = loadCustData(cd);
cd.setCache(obj);
.......
}
是說~用enum有什麼差別??...
修改彈性不太好(當然是比不上寫設定檔)
程式可讀性是高了點,因為可以定一些有意義的名稱,常數上應該是比較好看~
只是說,有時候做非開放式系統,也不用說什麼都做到設定檔上去,
有時候寫死增加別人偷code的難度,好像也是一種生存理論XD...
訂閱:
文章 (Atom)