寫程式的人都知道,程式很容易寫,但是bug卻很難除,在我們開發PC用的應用程式時,已經有非常優秀的除錯工具可以幫助我們除錯,但是在Palm上,以目前來說似乎沒有什麼比較有效的除錯工具。於是想起過去在螢幕上列印出一些訊息以協助除錯的日子。當我們在PC上Java Application的時候,我們可以利用System.out.println()這個函式幫我們在螢幕上輸出資料。
那麼在Palm上也可以這樣做嗎? 答案是肯定的。 如果可以,那資料都輸出到哪裡了呢? 嘿嘿!! KVMutil派上用場的時機到了。 請在您的Palm執行KVMutil這隻程式,並設定Screen Output的值,也就是說最多可以輸出13行
一旦這樣設定之後,您就可以在程式裡頭使用System.out.println()函式來輸出資料。
我們把之前的HelloWorld.java改寫成下面的樣子:
| | import com.sun.kjava.*; public
class HelloWorld extends Spotlet {
//用來關閉程式的按鈕
Button exitButton;
// 取得Grpahic物件,以便繪圖之用
static Graphics g = Graphics.getGraphics();
//動態產生一個Spotlet, 並註冊事件處理函式.
public static void main(String[] args)
{
System.out.println("HelloWorld Start") ;
HelloWorld hw = new HelloWorld() ;
hw.register(NO_EVENT_OPTIONS);
}
public HelloWorld()
{
exitButton = new Button("Goodbye World",70,120);
paint();
}
private void paint()
{
g.clearScreen();
g.drawString("Hello World",60, 80);
exitButton.paint();
}
/*
當觸控筆觸碰液晶螢幕,就會引發pen down事件,
接著叫用以下事件處理函式
*/
public void penDown(int x, int y)
{
System.out.println("Pen Down") ;
// 確認筆按下的位置在按鈕的邊界之內
if (exitButton.pressed(x,y))
{
System.exit(0);
}
} } |
|
程式執行之後,重新執行KVMutil,並按下 < View output >,就可以看到 HelloWorld所輸出的訊息,如下圖:
如果您是使用POSE(請參考附錄,對POSE會有詳盡的說明)執行KVM的話,您會在POSE所在的路徑之下發現兩個檔案,分別是STDOUT.txt與STDERR.txt,裡頭存放的內容正是前面這兩張圖裡頭所看到的文字內容。

眼尖的讀者會發現,KVMutil裡有個選項叫做Show heap stats,如下圖: |

當您點選了這個選項之後,每當您的程式執行之前,KVM都會對Heap的情形做出回報,底下是HelloWorld執行前KVM出現的訊息視窗: |

如果一開始設定了Save Output,而後來卻砍掉KVMutil.prc,那您的KVM.prc在執行時結果將會如下圖:
相信有了KVMutil的協助,一定可以幫助大家在程式寫作的路上更順手。 |
程式解說 |
| 相信有撰寫過Java Applet或是Java Servlet的讀者們都有知道,要製作Java Applet,就必須繼承自java.applet這個類別,要製作Java Servlet,則程式必須繼承自javax.servlet.http.HttpServlet這個類別。同理,要能夠在KVM上頭執行的Java Spotlet也必須要繼承自com.sun.kjava.Spotlet 。 因此一個Java Spotlet的程式外觀如下: | | | import com.sun.kjava.*; public class HelloWorld extends Spotlet {
public static void main(String[] args)
{
} } |
| Spotlet被KVM載入之後,就會開始接收一些基本的事件(event)並做出回應,Spotlet對待事件的方式與一般的GUI程式是有所區別的。寫過Applet的人都知道,畫面上的所有元件之間訊息傳遞都遵循著Java事件模型的機制在運作,但是在Spotlet上對於事件的處理有了本質上的改變。在Spotlet上,整個畫面被當作是一塊很大的是視窗,而不像PC上的視窗系統一個主視窗是由好幾個小視窗所構成。舉個例子來說,當Spotlet接收到觸控筆按下的時候,Spotlet就會呼叫相對應的事件處理函式(event handler),如下: | | public void penDown(int x, int y) {
} |
| 如果是在Applet之中,我們就必須在事件處理函式先判定事件的來源為何,是Button?還是其他GUI元件,可是在Spotlet裡並非如此,我們必須自己手動判動觸控筆所按下的位置是否在元件之中,所以程式如下: | | public void penDown(int x, int y) {
if (testButton.pressed(x,y))
{
/*對應的程式碼*/
} } | 這是Spotlet與Applet在事件處理上很大的一個不同。 | 另外,在Applet裡頭,要讓GUI元件與事件處理函式產生關聯,就必須要利用addXXXXListener函式來註冊,而這個函式的參數必須要是一個實做了XXXXListener介面的物件才行,這是整個Java事件模型裡頭委派機制的最重要部分。然而在Spotlet裡頭就簡單很多,只要呼叫Spotlet類別的register函式,並傳給適當的參數即可。在我們之前的範例裡頭,用了以下的程式碼做註冊: | | HelloWorld hw = new HelloWorld() ; hw.register(NO_EVENT_OPTIONS); |
| | 比起Applet,Spotlet的寫法簡單許多。之所以要儘量簡化Spotlet的程式結構,是因為過多的函式呼叫和複雜的訊息傳遞機制,會造成程式過大,執行起來速度也會太慢,有相當多方面的考量。 | | 當然,由於Palm本身的硬體限制,Spotlet所能展現的GUI無法如同在PC上使用AWT來撰寫GUI程式那樣的漂亮,GUI元件自然也無法像PC上提供的那麼多采多姿。但是com.sun.kjava.* 這個package裡頭還是提供了不少非常基本而有用的元件(widgets)比方說Dialog、 Button 、Bitmap等等。 | 接下來講到paint這個函式,熟悉Applet的朋友都知道,AWT裡頭的元件都會有個叫做paint的函式,函式原型如下: | | private void paint(Graphics g) |
| | 每次畫面要重畫的時候,Container會自動呼叫自己內部的所有元件,並呼叫他們的paint函式,並傳給這個函式一個可以用來繪圖的畫布,所以每個元件只要取得這個畫布,就可以利用它做一些基本的繪圖。不過,在Spotlet裡頭並沒有這樣的機制,螢幕上的所有繪圖都要由我們一手包辦,在此,我們將繪圖函式的原型做點修改如下:
本文关键:利用Java编写手机应用程序PalmOS基础篇
本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)
|
|