在PTT上面剛好看到有人在求決定晚餐的程式
於是利用一點閒雜時間,試著用GWT寫出來
--------------以上是前言------------------------
常常不知道晚餐想要吃什麼嗎??
有了這個小程式 就可以幫你決定今天晚餐要吃什麼
範例:http://moonjuice-sample.appspot.com/
說明:
1.將想要吃的食物放在list.txt檔案裡面,並且用半型的","分開
2.直接用瀏覽器執行Food.html即可 (需打開java script功能)
3.可自行編輯Food.css來稍微改變樣式,但是你可能會發現有改跟沒改差不多 >_^
4.預設食物清單是參考PTT jakevin 建立的宵夜簽名檔
5.若是有網頁空間者,可以將整份上傳至空間即可以使用
下載:
http://sites.google.com/site/moon80362/download/food.zip?attredirects=0&d=1
下次改版:(如果有改版的話)
新增上傳清單功能
未來展望(意思就是未來的事情只有未來人知道)
作一個777的一天吃什麼
2010年5月31日 星期一
2010年4月23日 星期五
[GWT]在GWT中使用JSON
為什麼會想用JSON呢??
原因很簡單,就只是因為XML一直出現錯誤,讓我很不爽(炸
廢話不多說
1. 在gwt.xml中
"<inherits name="com.google.gwt.json.JSON">"
2.JSON範例 (如果不清楚JSON的格式,可以參考這篇)
{
"products": [
{ "name": "name1", "type":"type1","info":"info1" },
{ "name": "name2", "type":"type2","info":"info2" },
{ "name": "name3", "type":"type3","info":"info3" }
]
}
3.程式碼:
private void parseJson(String text)
{
JSONObject json = (JSONObject) JSONParser.parse(text);
JSONArray ary = json.get("products").isArray();
for (int i = 0; i < ary.size(); ++i) {
RootPanel.get().add(new Label(ary.get(i).isObject().get("name").toString()));
RootPanel.get().add(new Label(ary.get(i).isObject().get("type").toString()));
RootPanel.get().add(new Label(ary.get(i).isObject().get("info").toString()));
}
}
原因很簡單,就只是因為XML一直出現錯誤,讓我很不爽(炸
廢話不多說
1. 在gwt.xml中
"<inherits name="com.google.gwt.json.JSON">"
2.JSON範例 (如果不清楚JSON的格式,可以參考這篇)
{
"products": [
{ "name": "name1", "type":"type1","info":"info1" },
{ "name": "name2", "type":"type2","info":"info2" },
{ "name": "name3", "type":"type3","info":"info3" }
]
}
3.程式碼:
private void parseJson(String text)
{
JSONObject json = (JSONObject) JSONParser.parse(text);
JSONArray ary = json.get("products").isArray();
for (int i = 0; i < ary.size(); ++i) {
RootPanel.get().add(new Label(ary.get(i).isObject().get("name").toString()));
RootPanel.get().add(new Label(ary.get(i).isObject().get("type").toString()));
RootPanel.get().add(new Label(ary.get(i).isObject().get("info").toString()));
}
}
2010年3月24日 星期三
2010年1月11日 星期一
2009年12月21日 星期一
[GWT]利用 HandlerManager 實作共用的 Event Bus
原作者:tkcn
關於 Listener 與 Handler 的差別,我推荐看這篇文章: GWT’s new Event Model – Handlers in GWT 1.6 [1]。
在這篇文章中,我將兩者與本篇文章有關的部份做介紹:
Listener:
由於 HandlerManager 能夠針對不同的 Event,dispatch 其對應的 Handler 去處理,因此我們也可以利用 HandlerManager 來做為整個 Web App 共用的 Event Bus。[2], [3]
先說明一下本篇文章欲使用的例子:
在一個 Web App 上,有許多的 Panel,我們現在希望當按下 A Panel 上的 Button 時,B Panel 上的 TextBox 會輸出文字。
在原本的做法裡,我們會讓 A panel 實作 ClickHandler,當 A panel 收到事件時,就去呼叫 B panel 所提供的方法。
這個作法會使得 A panel 必須持有 B panel 的 reference(就 UML 的角度來說就是 A 對 B 有 Aggregation 關係),這樣會使得 A, B 之間的耦合度高,造成未來擴充、修改的困難。
接下來就是解決辦法啦!
這樣一來,A 與 B 彼此可以完全不知道對方的存在,將可以大大的降低耦合度。
利用 HandlerManager 實作共用的 Event Bus
GWT 從版本 1.6 開始提供了新的 Event Model - Handler,並捨棄了原先的 Listener 方式。關於 Listener 與 Handler 的差別,我推荐看這篇文章: GWT’s new Event Model – Handlers in GWT 1.6 [1]。
在這篇文章中,我將兩者與本篇文章有關的部份做介紹:
Listener:
- 對於每一個 Event Source 會有一個對應的 Listener,例如 MouseListener, KeyboardListener...等。
- 在每一個 Widget 中,針對每一種 Event Source 的 Listener,都會用一個獨立的 ListenerCollection 去紀錄。
- 每一個 Event Type 都會有一個對應的 Handler,因此原先 MouseListener 相關的事件,將會被重新區分成 MouseDownHandler, MouseUpHandler...等。這樣做的一個額外的好處是,當只需要針對一種 Event Type 做處理時,實作 Handler 的類別只需要 over-ridding 一個對應的 method,而不需要像寫 Listener 時,仍然需要 over-ridding 其他沒用到的 method。
- 每一個 Widget 中,都只會有一個 HandlerManager,負責紀錄所有的 Event Handler。
由於 HandlerManager 能夠針對不同的 Event,dispatch 其對應的 Handler 去處理,因此我們也可以利用 HandlerManager 來做為整個 Web App 共用的 Event Bus。[2], [3]
先說明一下本篇文章欲使用的例子:
在一個 Web App 上,有許多的 Panel,我們現在希望當按下 A Panel 上的 Button 時,B Panel 上的 TextBox 會輸出文字。
在原本的做法裡,我們會讓 A panel 實作 ClickHandler,當 A panel 收到事件時,就去呼叫 B panel 所提供的方法。
這個作法會使得 A panel 必須持有 B panel 的 reference(就 UML 的角度來說就是 A 對 B 有 Aggregation 關係),這樣會使得 A, B 之間的耦合度高,造成未來擴充、修改的困難。
接下來就是解決辦法啦!
- 首先,於 EntryPoint 建立 HandlerManager 物件,並且將 Reference 傳給所有的 sub-component,這個部份可以利用 Constructor 達成。
HandlerManager eventBus = new HandlerManager(null); - 然後在 B panel 裡頭寫上事件處理,並且向 Event Bus 註冊。
@Override
protected onLoad(){
// register event handler
fooRegistration = eventBus.addHandler(FooEvent.TYPE, new FooHandler(){
@Override
public void onFoo(FooEvent event) {
textBox.setText("A panel's button click!");
}
});
}
@Override
protected onUnload(){
// unregister event handler
fooRegistration.removeHandler();
} - 最後是 A panel 的事件觸發,當按下按鈕時:
eventBus.fireEvent(new FooEvent());
這樣一來,A 與 B 彼此可以完全不知道對方的存在,將可以大大的降低耦合度。
2009年9月27日 星期日
[閒聊] 台南一日遊
就已經知道要去古蹟風景 結果沒有人帶相機是怎樣!!
老實說這一趟行程因為卡到他們要去吃丹丹,所以變的超級不順的XDD
不過順便繞一下台南市也不錯
原本約好11點要在台南集合的,不過條臨時有事情耽誤了
大概11點半才集合完畢!
第1站:丹丹漢堡 崇德店
第2站:孔廟
第3站:國家文學館
第4站:赤崁樓 祀典武廟 大天后宮
第5站:中正路 度小月擔仔麵
第6站:億載金城
第7站:周氏蝦捲 依雷特布丁
第8站:四草大橋看夕陽
第9站:花園夜市
這次實在有點可惜,原本想說一些古蹟大家應該逛一下子就結束了
不過大家還是都逛了一圈,拍拍照片
所以,要去安平古堡跟延平老街的行程就臨時取消了。
原本還擔心說,一下子就逛完,然後有時間再去逛安平樹屋或洋行的
看來是白擔心了,呵呵。
相片貼在這邊:http://picasaweb.google.com.tw/moon80362/RisfyK#
老實說這一趟行程因為卡到他們要去吃丹丹,所以變的超級不順的XDD
不過順便繞一下台南市也不錯
原本約好11點要在台南集合的,不過條臨時有事情耽誤了
大概11點半才集合完畢!
第1站:丹丹漢堡 崇德店
第2站:孔廟
第3站:國家文學館
第4站:赤崁樓 祀典武廟 大天后宮
第5站:中正路 度小月擔仔麵
第6站:億載金城
第7站:周氏蝦捲 依雷特布丁
第8站:四草大橋看夕陽
第9站:花園夜市
這次實在有點可惜,原本想說一些古蹟大家應該逛一下子就結束了
不過大家還是都逛了一圈,拍拍照片
所以,要去安平古堡跟延平老街的行程就臨時取消了。
原本還擔心說,一下子就逛完,然後有時間再去逛安平樹屋或洋行的
看來是白擔心了,呵呵。
相片貼在這邊:http://picasaweb.google.com.tw/moon80362/RisfyK#
訂閱:
文章 (Atom)