跳到主要內容

Processing + Swing = Grider App


用Processing來處理一些連續圖像和影片實在相當方便,簡單幾行就可以搞定。對熟悉程式碼的人來說是這麼回事,但是要給不會看程式碼的人用,還是做個圖形界面會比較方便。適逢Processing釋出2.0 beta版,就順道把先前做的影片打格子程式,也就是那個姑且被我稱作Grider的程式做了一個小小的升級改版,整合Swing為它加上簡單的使用者界面。



之前評論道Processing所使用的函式庫有點過時,那個時候我使用的版本還是1.5,而2.x版則還在相當alpha的階段。不過,前些天重新逛了Processing.org的網站,發現幾乎所有的文件與範例,都已經更新成為2.x版本,便下載了2.0b7來改寫要為影片打格子的程式。

如果你只要使用Processing基本的功能,應該是不會碰到processing.video這個package。但既然我們處理的是影片,想不碰到這個也不太可能。Processing 1.5的video是直接呼叫QTJava,但它是32位元的,而且也被Apple宣告過時。在前一個Grider版本中,我使用另外一個函式庫來處理影片,也就是GSVideo。展開Processing 2.0b7後才看到,GSVideo這個函式庫已經被包到processing.video裡頭,並且能用64位元的方式來跑。對於Mac使用者來說,真是一大福音,因為現在比較常用的版本幾乎都是64位元的,起碼從我手邊還會用到的10.6開始。

只不過,升級倒也不是沒有缺點。在1.5的版本中,processing.video本來有一個MovieMaker的class,可以直接輸出QuickTime或avi影片,這在Processing 2.0裡頭好像被拿掉了。還好,這個class對我沒有影響。

大致弄清楚Processing更動的部分後,便開始修改程式碼。首先把之前GSMovie的物件全都換回Processing裡頭的Movie,反正兩者是相同的,沒必要再去匯入一個函式庫。接著,便要開始橋接Processing和Swing兩個東西,對我來說,這是個新的挑戰。

開發Java使用者界面大致上就是兩個選擇,一個是SWT (The Standard Widget Toolkit),另外一個就是Swing。至於AWT,那個實在太麻煩,完全不在我的考慮範圍之內。我比較熟悉的是SWT,可是偏偏在Mac上,想做個SWT_AWT的橋接,或是要內嵌個Swing物件,總是會碰到Java CocoaComponent compatibility mode的問題,更新到目前最新的版本依然沒辦法解決,只好硬著頭皮使用Swing來做使用者介面。

用WindowBuilder來拉界面節省了很多時間,免除了猜測物件長相和功能的困擾。但這得要在eclipse裡面做,意味著要將Processing的主要函式庫給拿出來。這部分在Processing.org官網上有教學,請自行參考Processing in Eclipse。比較麻煩的是processing.video裡頭的東西,除了要把幾個jar檔案一併拉出來外,還要把macosx64的資料夾一起拉出來,否則影片根本沒辦法載入。



解決影片播放的問題後,接下來要把Processing的PApplet納入Swing當中。在PApplet的技術文件裡面,有一個簡化的範例,示範如何從AWT的Frame裡面將PApplet初始化。Swing的JFrame繼承了AWT的Frame,也可以使用同樣的方式。說穿了,不過是將PApplet當做一個component塞進Swing裡頭,在最後要記得呼叫 init() 去執行PApplet的內容。

 public class ExampleFrame extends Frame {

     public ExampleFrame() {
         super("Embedded PApplet");

         setLayout(new BorderLayout());
         PApplet embed = new Embedded();
         add(embed, BorderLayout.CENTER);

         // important to call this whenever embedding a PApplet.
         // It ensures that the animation thread is started and
         // that other internal variables are properly set.
         embed.init();
     }
 }

 public class Embedded extends PApplet {

     public void setup() {
         // original setup code here ...
         size(400, 400);

         // prevent thread from starving everything else
         noLoop();
     }

     public void draw() {
         // drawing code goes here
     }

     public void mousePressed() {
         // do something based on mouse movement

         // update the screen (run draw once)
         redraw();
     }
 }

解決這些麻煩的問題之後,剩下的就是使用者介面各個功能的調整。雖說比較沒有技術上的障礙,但這個部分似乎花了最多時間,有太多觸發事件得要處理。在一陣辛勞之後,Grider算是可以用了,只要再花些時間做些測試與修正,應該就可以釋出了。


留言

熱門文章

OREO聖誕麋鹿 #差不多食譜

聖誕節就快到囉!今年我們用現成的材料,來做些簡單好玩的小東西。第一個登場的,就是有著紅鼻子的麋鹿。 3隻「OREO聖誕麋鹿」差不多需要這些材料: OREO餅乾 ...... 3片 蝴蝶餅 ...... 3-6片(掰斷有失敗的機會) 餅乾棒 ...... 3根(我用百力滋) 眼睛糖 ...... 6顆 紅色m&m's ...... 3顆(紅鼻子) 融化的巧克力 ...... 適量(黏著用) 「OREO聖誕麋鹿」差不多是這麼做的: Step 1. 準備好材料 計算一下自己想要做多少隻OREO聖誕麋鹿,按照材料表把需要的餅乾糖果給買回來。材料備齊之後,就把巧克力拿去用微波爐融化備用。沒有微波爐的也可以隔水加熱,想辦法把巧克力融化就可以。 Step 2. 製作麋鹿 再過來就要開始製作麋鹿了!先把OREO轉開,留下有奶油的那邊,待會方便把餅乾稍壓一下固定。 把蝴蝶餅掰斷成鹿角的樣子,沾上巧克力,擺到OREO上面。餅乾棒同樣沾上巧克力,一樣放上OREO。接著蓋上OREO,稍微壓一下。 這邊可以大膽去擺,在巧克力凝固前都可以調整。要是發現黏不太住,多沾點巧克力再試試。 Step 3. 擺出表情 接下來要用眼睛糖和紅色m&m's做出麋鹿的表情。用筷子將眼睛糖和m&m's沾上巧克力,黏到眼睛鼻子相應的位置就可以。 沒有辦法買到眼睛糖的,可以用白巧克力先畫出眼白,再用黑巧克力點出眼珠。紅鼻子也可以自己換成橘色、綠色、藍色等等不同的m&m's。 Step 4. 讓巧克力凝固 表情做好之後不要馬上移動,得要有點耐心讓巧克力凝固。要不然悲劇馬上就會發生,不是表情變扭曲,就是整支麋鹿散架。 等巧克力凝固後,就可以像棒棒糖那樣拿起來玩耍了。再來杯熱牛奶,整隻麋鹿給他泡下去也很有趣。 最後幫大家整理一下「OREO聖誕麋鹿」的做法: 巧克力用微波爐加熱融化備用。 轉開OREO。 蝴蝶餅掰成鹿角的形狀,沾巧克力後放上OREO餅乾。 餅乾棒同樣沾上巧克力,擺上OREO餅乾。 蓋上餅乾,在眼睛糖和紅色m&m’s背後沾上巧克力,黏到眼睛和鼻子相應的位置。 稍微等一下,讓巧克力凝固就好囉!

差不多食譜:手工巧克力餅乾 Chocolate Cookies

又是手工餅乾,最近一連出了兩份餅乾食譜,這個「手工巧克力餅乾」已經是第三份了。會不會有更多呢?我可以告訴大家,這是肯定的。 要怪就怪這個陰鬱的冬季雨天,哪裡都不方便去,也懶得出去。餅乾櫃空在那邊已經很久了,雖然有時候會嘴饞,但也沒有迫切去補貨的必要。反正經常開伙,平常該有的材料都會有,自己弄個成分完全透明的零食,也是個不錯的選擇。再說,用烤箱進行烘焙時,房間會變得比較乾燥,也比較溫暖。在夏天是個折磨,但到了冬天,這種感覺還滿不錯的。 話不多說,開始進行這一道「手工巧克力餅乾」的準備工作。

差不多食譜:檸檬餅乾 Lemon Biscuits

寒流來襲,氣象局持續發布低溫特報。在這冷颼颼的冬日,差不多食譜為您準備了一支有溫度的影片食譜「檸檬餅乾 Lemon Biscuits」。檸檬的酸味能夠讓您有清新的味覺,用檸檬做的餅乾則讓您解除冬日過份進補的油膩感,同時又滿足一直想吃東西的衝動。但我可沒說這種吃法的卡路里不高,對您的身材不會有影響。恐怕您還是得自己稍微節制些! 不過,說老實話,我單純是因為天氣太冷,所以把烤箱拿來當暖爐用。坐在烤箱後面等待餅乾完成,果真有暖呼呼的感覺。