[轉帖]J2ME學習札記3

shenvon36發表於2002-08-09
Ticker物件
發信站: 北大未名站 (2001年10月20日21:14:25 星期六) , 站內信件
Ticker物件是一個專案型別的物件,它的作用相當於一個滾動訊息欄,在螢幕的上方顯示滾
動的資訊。 Ticker類的建構函式僅有一個引數,那就是需要滾動顯示的訊息。
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class ShowTicker extends MIDlet implements CommandListener
{
private Display display;
private Form props;

private Command exitCommand = new Command("Exit", Command.EXIT, 1);

public ShowTicker()
{
display = Display.getDisplay(this);
}

public void startApp()
{
props = new Form("Hello World");
props.append("Hello World!\n");
Ticker ticker=new Ticker("С¥һҹ
;Ìý´ºÓê");
props.setTicker(ticker);
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}

public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}

}
ShowTicker.java程式的執行效果如下圖所示:

獲取文字框的值
發信站: 北大未名站 (2001年10月21日00:34:19 星期天) , 站內信件

在前面的例子中,我們已經演示瞭如何構造J2ME程式的使用者介面。現在有一個問題,那就是
如何與使用者介面互動呢?亦即如何獲取使用者透過使用者介面輸入的值呢?請看下面的例子。
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class GetTextBoxValue extends MIDlet implements CommandListener
{
private Display display;
private TextBox txtBox;

private Command exitCommand = new Command("Exit", Command.EXIT, 1);
private Command getCommand = new Command("GETVALUE", Command.OK, 1);

public GetTextBoxValue()
{
display = Display.getDisplay(this);
}

public void startApp()
{
//or :
//String str="hello world";
//txtBox = new TextBox("Text Box",str,str.length(),0);
//the follow code is wrong:
//txtBox = new TextBox("Text Box",str,any number here,0);

txtBox = new TextBox("Text Box",null,200,0);

txtBox.addCommand(exitCommand);
txtBox.addCommand(getCommand);
txtBox.setCommandListener(this);
display.setCurrent(txtBox);
}

public void valueScreen()
{
Form props=new Form("get text box value");
props.append(txtBox.getString());
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}

public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
if(c==getCommand)
{
valueScreen();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
txtBox = null;
}

}
在上面的例子中(GetTextBoxValue.java),當我們往文字框中輸入文字,並按下退出按鈕,接
著選擇GETVALUE命令的時候,將會呼叫valueScreen()方法。valueScreen()方法的原始碼如下
:
public void valueScreen()
{
Form props=new Form("get text box value");
props.append(txtBox.getString());
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}
valueScreen()方法的邏輯是:首先建立一個容器物件Form,然後呼叫TextBox物件的getStr
ing()方法,獲取文字框中的輸入值,追加到容器物件中,最後將此Form物件作為螢幕的當前顯
示物件。GetTextBoxValue.java的執行效果如下面兩圖所示:

Date物件
發信站: 北大未名站 (2001年10月21日00:35:20 星期天) , 站內信件

Date物件是屬於java.util包的,它的作用是返回當前的時間。請看下面的程式碼:
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class GetDate extends MIDlet implements CommandListener
{
private Display display;
private Form props;
private Date date;

private Command exitCommand = new Command("Exit", Command.EXIT, 1);

public GetDate()
{
display = Display.getDisplay(this);
}

public void startApp()
{
props = new Form("Hello World");
props.append("Hello World!\n");
date=new Date();
props.append("Now Time:"+date.getTime()+"\n");

props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}

public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}

}
GetDate.java程式的執行效果如下圖所示:


--
TimeZone物件
發信站: 北大未名站 (2001年10月21日00:36:16 星期天) , 站內信件

TimeZone物件也是屬於java.util包的。這個物件的作用是提供關於時區的資訊。TimeZon
e類有一個靜態方法----getDefault(),可以獲取與當前系統相關的時區物件。getAvailable
IDs()方法可以獲取系統中所有可用的時區的ID號,getID()方法可以獲取系統當前所設定的時
區。具體的例子如下所示:
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class GetTimeZone extends MIDlet implements CommandListener
{
private Display display;
private Form props;
//private Date date;
private TimeZone zone;

private Command exitCommand = new Command("Exit", Command.EXIT, 1);

public GetTimeZone()
{
display = Display.getDisplay(this);
}

public void startApp()
{
props = new Form("Hello World");
props.append("Hello World!\n");
//date=new Date();
//props.append("Now Time:"+date.getTime()+"\n");
zone=TimeZone.getDefault();
String []zoneid=zone.getAvailableIDs();
for(int i=0;i<zoneid.length;i++)
{
props.append(zoneid+"\n");
}
props.append("Current Time Zone:"+zone.getID()+"\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}

public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}

}
GetTimeZone.java程式的執行效果如下圖所示:


--
Calendar物件
發信站: 北大未名站 (2001年10月21日00:37:43 星期天) , 站內信件

Calendar物件歸屬於java.util包,它可以提供更為詳盡的時間資訊。具體的例子如下所示
:
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class GetCalendar extends MIDlet implements CommandListener
{
private Display display;
private Form props;
//private Date date;
//private TimeZone zone;
//private Calendar calendar;

private Command exitCommand = new Command("Exit", Command.EXIT, 1);

public GetCalendar()
{
display = Display.getDisplay(this);
}

public void startApp()
{
props = new Form("Hello World");
props.append("Hello World!\n");

Calendar rightNow = Calendar.getInstance();
props.append("YEAR:"+rightNow.get(Calendar.YEAR)+"\n");
props.append("MONTH:"+rightNow.get(Calendar.MONTH)+"\n");
props.append("DAY OF MONTH:"
+rightNow.get(Calendar.DAY_OF_MONTH)+"\n");
props.append("HOUR OF DAY:"
+rightNow.get(Calendar.HOUR_OF_DAY)+"\n");
props.append("MINUTE:"
+rightNow.get(Calendar.MINUTE)+"\n");
props.append("SECOND:"
+rightNow.get(Calendar.SECOND)+"\n");
props.append("MILLISECOND:"
+rightNow.get(Calendar.MILLISECOND)+"\n");

//date=new Date();
//props.append("Now Time:"+date.getTime()+"\n");
//zone=TimeZone.getDefault();
//String []zoneid=zone.getAvailableIDs();
//for(int i=0;i<zoneid.length;i++)
//{
//props.append(zoneid+"\n");
//}
//props.append("Current Time Zone:"+zone.getID()+"\n");

props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}

public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{

}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}

}
GetCalendar.java程式的執行效果如下圖所示:


--
如何建立HTTP連線
發信站: 北大未名站 (2001年10月21日00:40:04 星期天) , 站內信件

在J2ME程式中,可以利用HttpConnection介面建立HTTP連線,訪問遠端伺服器上的資源。具
體的程式碼如下所示:
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;

public class GetHttpConnection extends MIDlet implements CommandListener
{
private Display display;
private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);

public GetHttpConnection()
{
display = Display.getDisplay(this);
}

public void startApp()
{
props = new Form("Get Http Connection");
//props.append("Hello World!\n");
try
{
HttpConnection conn=(HttpConnection) Connector.open
("http://rainbow:8080/index.html");
//conn.setRequestProperty("user","fancy");
props.append("Date:"+conn.getDate()+"\n");
props.append("Expiration:"+
conn.getExpiration()+"\n");
props.append(conn.getHost()+"\n");
props.append("Last Modified:"+
conn.getLastModified()+"\n");
props.append("Port:"+conn.getPort()+"\n");
props.append("Protocol:"+
conn.getProtocol()+"\n");
props.append("Request Method:"+
conn.getRequestMethod()+"\n");
props.append("Response Code:"+
conn.getResponseCode()+"\n");
props.append("Encoding:"+
conn.getEncoding()+"\n");
props.append("Length:"+conn.getLength()+"\n");
props.append("Type:"+conn.getType()+"\n");
props.append("URL:"+conn.getURL()+"\n");
props.append("Response Message:"+
conn.getResponseMessage()+"\n");
}
catch(Exception fe)
{
props.append("Error:"+fe.getMessage());
}
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}

public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}
}
Connector類提供了open()方法,可以和各種各樣的遠端資源建立連線。open()方法的引數
就是遠端資源的URL地址。open()方法的返回值是一個Connection介面。為了建立HTTP連線,
我們應該將它強制轉換為HttpConnection介面的形式。一旦獲取HttpConnection介面的例項
物件,就可以呼叫HttpConnection介面的各種方法,得到關於HTTP連線的各種資訊。

使用J2ME+JavaMail傳送電子郵件
發信站: 北大未名站 (2001年10月21日00:41:24 星期天) , 站內信件

我的想法是建立一個Web伺服器,使用Tomcat 4.0,支援JSP技術。再配置一個Mail伺服器,
使用的軟體是Imail 7.0.4。首先編寫一個可以傳送電子郵件的JSP程式(post.jsp),具體程式碼
如下所示:
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%@ page import="javax.activation.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>

<%!
public class SmtpAuthenticator extends javax.mail.Authenticator
{
public javax.mail.PasswordAuthentication getPasswordAuthentication()
{
return new javax.mail.PasswordAuthentication("fancy", "fancy");
}
}
%>

<%
String username="fancyrainbow";
String password="fancy";
String from="fancy@rainbow";
String to="fancy@rainbow";
String cc="fancy@rainbow";
String subject="J2ME Mail Test";
//String content="J2ME Mail Test";
String content=request.getParameter("content");

Properties props = System.getProperties();
props.put("mail.smtp.auth","true");
props.put("mail.smtp.host","rainbow"); //263

SmtpAuthenticator sa=new SmtpAuthenticator();
Session sess = Session.getInstance(props, sa);
sess.setDebug(true);

Message msg = new MimeMessage(sess);
msg.setFrom(new InternetAddress(from));
msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to, false));
msg.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc, false));
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(content);
Transport.send(msg);
%>
Send Message OK!
我將post.jsp程式儲存在Tomcat 4.0的ROOT目錄下面,然後使用Web瀏覽器測試此程式成功
。然後再將上一個J2ME程式(GetHttpConnection.java)改一改,讓它與Tomcat 4.0伺服器建立
連線,請求post.jsp程式。相關程式碼如下所示:
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;

public class SendMail extends MIDlet implements CommandListener
{
private Display display;
private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);

public SendMail()
{
display = Display.getDisplay(this);
}

public void startApp()
{
props = new Form("Get Http Connection");
//props.append("Hello World!\n");
try
{
HttpConnection conn=(HttpConnection)Connector.open("http://rainbow:8080/post.
jsp?content=Hello World");
//conn.setRequestProperty("user","fancy");
props.append("Date:"+conn.getDate()+"\n");
props.append("Expiration:"+conn.getExpiration()+"\n");
props.append(conn.getHost()+"\n");
props.append("Last Modified:"+conn.getLastModified()+"\n");
props.append("Port:"+conn.getPort()+"\n");
props.append("Protocol:"+conn.getProtocol()+"\n");
props.append("Request Method:"+conn.getRequestMethod()+"\n");
props.append("Response Code:"+conn.getResponseCode()+"\n");
props.append("Encoding:"+conn.getEncoding()+"\n");
props.append("Length:"+conn.getLength()+"\n");
props.append("Type:"+conn.getType()+"\n");
props.append("URL:"+conn.getURL()+"\n");
props.append("Response Message:"+conn.getResponseMessage()+"\n");
//InputStream is=conn.openInputStream();
//DataInputStream dis=new DataInputStream(is);
//props.append("System Info:"+dis.readUTF()+"\n");
props.append("Send Mail OK!"+"\n");

}
catch(Exception fe)
{
props.append("Error:"+fe.getMessage());
}
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}

public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}
}
啟動Tomcat 4.0、Imail 7.0.4、J2MEWTK。在J2MEWTK中執行SendMail.java程式,事後檢查
郵箱,發現已經成功的收到了郵件。
有兩點需要說明一下:
首先,按照上面的模式,我們可以編寫出功能更為強大的程式來,例如使用J2ME+JDBC+JSP訪
問遠端的資料庫系統,訪問EJB元件等等。
其次,如果要讀取post.jsp程式的輸出資訊,你可以從HttpConnection介面中獲取一個輸
入流物件,逐個讀取輸入流中的資料即可。具體的程式碼我就不舉了,你可以參考J2ME的DOC。


--
後記
發信站: 北大未名站 (2001年10月21日00:42:32 星期天) , 站內信件

終於寫完啦!
自從大一接觸Java以來,四年了,每天不Java一下就手癢,每天不Java一下就覺得有些失落,
Java已經成為我的生活的一個部分。Java給予我很多的樂趣,我想我應該為Java作些什麼。
四天前,當我開始接觸J2ME,當我使用J2MEWTK成功執行HelloWorld程式的時候,這個念頭再次
浮現在我的腦海裡。我應該為Java做些自己力所能及的事情,所以才會有這篇不算太長的文章
《J2ME學習札記》。不管別人的看法怎麼樣,我總算是了了自己的一番心事。我之所以寫這篇
文章,還有另一個目的,那就是將我從Java中得到樂趣與你分享,希望你也能夠將你從Java中
獲取的樂趣寫出來,與大家分享。

相關文章