24/05/2018, 17:08

Thành phần Form và Items

Trong phần này sẽ giới thiệu các thành phần được hiển thị ra trên một For m . Một For m chỉ đơn giản là một khung chứa các thành phần, mà mỗi thành phần được thừa kế từ lớp Ite m . Chúng ta sẽ xem qua các thành phần hiển thị trên thiết bị trên: ...

Trong phần này sẽ giới thiệu các thành phần được hiển thị ra trên một Form. Một Form chỉ đơn giản là một khung chứa các thành phần, mà mỗi thành phần được thừa kế từ lớp Item. Chúng ta sẽ xem qua các thành phần hiển thị trên thiết bị trên:

• DateField

• Gauge

• StringItem

• TextField

• ChoiceGroup

• Spacer

• CustomItem

• Image and ImageItem

Thành phần DateField cung cấp một phương tiện trực quan để thao tác đối tượng Dateđược định nghĩa trong java.util.Date. Khi tạo một đối tượng DateField, bạn cần chỉ rõ là người dùng chỉ có thể chỉnh sửa ngày, chỉnh sửa giờ hay đồng thời cả hai. Các phương thức dựng của lớp DateField gồm:

DateField(String label, int mode)

DateField(String label, int mode, TimeZone timeZone) Các mode tương ứng của lớp DateFieldgồm: DateField.DATE_TIME:cho phép thay đổi ngày giờ DateField.TIME:chỉ cho phép thay đổi giờ DateField.DATE:chỉ cho phép thay đổi ngày

dụ:

private DateField dfAlarm;

// Tạo một đổi tượng DateField với nhãn, cho phép thay đổi cả ngày và giờ dfAlarm = new DateField("Set Alarm Time", DateField.DATE_TIME); dfAlarm.setDate(new Date());

Dưới đây là đoạn chương trình mẫu thử nghiệm đổi tượng DateField

import java.util.*;

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

import java.util.TimerTask;

public class DateFieldTest extends MIDlet implements ItemStateListener, CommandListener

{

private Display display; // Reference to display object

private Form fmMain; // Main form

private Command cmExit; // Exit MIDlet

private DateField dfAlarm; // DateField component

public DateFieldTest()

{

display = Display.getDisplay(this);

// The main form

fmMain = new Form("DateField Test");

// DateField with todays date as a default

dfAlarm = new DateField("Set Alarm Time", DateField.DATE_TIME);

dfAlarm.setDate(new Date());

// All the commands/buttons

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

// Add to form and listen for events

fmMain.append(dfAlarm);

fmMain.addCommand(cmExit);

fmMain.setCommandListener(this);

fmMain.setItemStateListener(this);

}

public void startApp ()

{

display.setCurrent(fmMain);

}

public void pauseApp()

{ }

public void destroyApp(boolean unconditional)

{ }

public void itemStateChanged(Item item)

{

System.out.println("Date field changed.");

}

public void commandAction(Command c, Displayable s)

{

if (c == cmExit)

{

destroyApp(false);

notifyDestroyed();

}

}

}

Một thành phần Gauge là một kiểu giao diện thường được dùng để mô tả mức độ hoàn thành một công việc. Có 2 loại Gauge là loại tương tác và loại không tương tác. Loại đầu cho phép người dùng có thể thay đổi Gauge, loại 2 thì đòi hỏi người phát triển phải cập nhật Gauge

Dười đây là hàm dựng của lớp Gauge:

Gauge(String label, boolean interactive, int maxValue, int initialValue)

dụ :

private Gauge gaVolume; // Điều chỉnh âm lượng gaVolume = new Gauge("Sound Level", true, 100, 4);

Dưới đây là đoạn chương trình mẫu minh họa cách sử dụng lớp Gauge

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class InteractiveGauge extends MIDlet implements CommandListener

{

private Display display; // Reference to display object

private Form fmMain; // The main form

private Command cmExit; // Exit the form

private Gauge gaVolume; // Volume adjustment

public InteractiveGauge()

{

display = Display.getDisplay(this);

// Create the gauge and exit command

gaVolume = new Gauge("Sound Level", true, 50, 4);

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

// Create form, add commands, listen for events

fmMain = new Form("");

fmMain.addCommand(cmExit);

fmMain.append(gaVolume);

fmMain.setCommandListener(this);

}

// Called by application manager to start the MIDlet.

public void startApp()

{

display.setCurrent(fmMain);

}

public void pauseApp()

{ }

public void destroyApp(boolean unconditional)

{ }

public void commandAction(Command c, Displayable s)

{

if (c == cmExit)

{

destroyApp(false);

notifyDestroyed();

}

}

}

Một thành phần StringItemđược dùng để hiển thị một nhãn hay chuỗi văn bản. Người dùng không thể thay đổi nhãn hay chuỗi văn bản khi chương trình đang chạy. StringItem không nhận ra sự kiện

Phương thức dựng của lớp StringItem

StringItem(String label, String text)

Dưới đây là đoạn mã minh họa việc sử dụng đối tượng StringItem

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class StringItemTest extends MIDlet implements CommandListener

{

private Display display; // Reference to Display object

private Form fmMain; // Main form

private StringItem siMsg; // StringItem

private Command cmChange; // Change the label and message

private Command cmExit; // Exit the MIDlet

public StringItemTest()

{

display = Display.getDisplay(this);

// Create text message and commands

siMsg = new StringItem("Website: ", "www.IBM.com");

cmChange = new Command("Change", Command.SCREEN, 1);

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

// Create Form, add Command and StringItem, listen for events

fmMain = new Form("StringItem Test");

fmMain.addCommand(cmExit);

fmMain.addCommand(cmChange);

fmMain.append(siMsg);

fmMain.setCommandListener(this);

}

// Called by application manager to start the MIDlet.

public void startApp()

{

display.setCurrent(fmMain);

}

public void pauseApp()

{ }

public void destroyApp(boolean unconditional)

{ }

public void commandAction(Command c, Displayable s)

{

if (c == cmChange)

{

// Change label

siMsg.setLabel("Section: ");

// Change text

siMsg.setText("developerWorks");

// Remove the command

fmMain.removeCommand(cmChange);

}

else if (c == cmExit)

{

destroyApp(false);

notifyDestroyed();

}

}

}

Một thành phần TextField thì tương tự như bất kỳ các đối tượng nhập văn bản tiêu biểu nào. Bạn có thể chỉ định một nhãn, số ký tự tối đa được phép nhập, và loại dữ liệu được phép nhập. Ngoài ra TextField còn cho phép bạn nhập vào mật khẩu với các ký tự nhập vào sẽ được che bởi các ký tự mặt nạ

Phương thức dựng của lớp TextField

TextField(String label, String text, int maxSize, int constraints)

Thành phần thứ 3 constraints là thành phần mà chúng ta quan tâm, vì nó là phương tiện để xác định loại dữ liệu nào được phép nhập vào TextField

MIDP định nghĩa các tham số ràng buộc sau cho thành phần TextField:

ANY: cho phép nhập bất kỳ ký tự nào

EMAILADDR: chỉ cho phép nhâp vào các địa chỉ email hợp lệ

NUMERIC: chỉ cho phép nhập số

PHONENUMBER: Chỉ cho phép nhập số điện thoại

URL: Chỉ cho phép nhập các ký tự hợp lệ bên trong URL

PASSWORD: che tất cả các ký tự nhập vào

Dưới đây là đoạn mã minh họa việc sử dụng thành phần TextField

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class TextFieldTest extends MIDlet implements CommandListener

{

private Display display; // Reference to Display object

private Form fmMain; // Main form

private Command cmTest; // Get contents of textfield

private Command cmExit; // Command to exit the MIDlet

private TextField tfText; // Textfield

public TextFieldTest()

{

display = Display.getDisplay(this);

// Create commands

cmTest = new Command("Get Contents", Command.SCREEN, 1);

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

// Textfield for phone number

tfText = new TextField("Phone:", "", 10, TextField.PHONENUMBER);

// Create Form, add Commands and textfield, listen for events

fmMain = new Form("Phone Number");

fmMain.addCommand(cmExit);

fmMain.addCommand(cmTest);

fmMain.append(tfText);

fmMain.setCommandListener(this);

}

// Called by application manager to start the MIDlet.

public void startApp()

{

display.setCurrent(fmMain);

}

public void pauseApp()

{ }

public void destroyApp(boolean unconditional)

{ }

public void commandAction(Command c, Displayable s)

{

if (c == cmTest)

{

System.out.println("TextField contains: " + tfText.getString());

}

else if (c == cmExit)

{

destroyApp(false);

notifyDestroyed();

}

}

}

Đoạn mã trên chỉ mới áp dụng một ràng buộc trên đối tượng TextField. Chúng ta có thể thêm một ràng buộc thứ 2 bằng cách:

tfText = new TextField("Phone:", "", 10,

Thành phần ChoiceGroup cho phép người dùng chọn từ một danh sách đầu vào

đã được định nghĩa trước. ChoiceGroup có 2 loại:

multi-selection(chophépchọnnhiềumục): nhóm này có liên quan đến các checkbox

exclusive-selection(chỉ đượcchnmộtmục): nhóm này liên quan đến nhóm các radio button

Dưới đây là đoạn mã minh họa cho việc sử dụng ChoiceGroup:

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class ChoiceGroupTest extends MIDlet implements ItemStateListener, CommandListener

{

private Display display; // Reference to display object

private Form fmMain; // Main form

private Command cmExit; // A Command to exit the MIDlet

private Command cmView; // View the choice selected

private int selectAllIndex; // Index of the "Select All" option

private ChoiceGroup cgPrefs; // Choice Group of preferences

private int choiceGroupIndex; // Index of choice group on form

public ChoiceGroupTest()

{

display = Display.getDisplay(this);

// Create a multiple choice group

cgPrefs = new ChoiceGroup("Preferences", Choice.MULTIPLE);

// Append options, with no associated images

cgPrefs.append("Replace tabs with spaces", null);

cgPrefs.append("Save bookmarks", null);

cgPrefs.append("Detect file type", null);

selectAllIndex = cgPrefs.append("Select All", null);

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

cmView = new Command("View", Command.SCREEN,2);

// Create Form, add components, listen for events

fmMain = new Form("");

choiceGroupIndex = fmMain.append(cgPrefs);

fmMain.addCommand(cmExit);

fmMain.addCommand(cmView);

fmMain.setCommandListener(this);

fmMain.setItemStateListener(this);

}

public void startApp()

{

display.setCurrent(fmMain);

}

public void pauseApp()

{ }

public void destroyApp(boolean unconditional)

{ }

public void commandAction(Command c, Displayable s)

{

if (c == cmView)

{

boolean selected[] = new boolean[cgPrefs.size()];

// Fill array indicating whether each element is checked

cgPrefs.getSelectedFlags(selected);

for (int i = 0; i < cgPrefs.size(); i++)

System.out.println(cgPrefs.getString(i) +

(selected[i] ? ": selected" : ": not selected"));

}

else if (c == cmExit)

{

destroyApp(false);

notifyDestroyed();

}

}

public void itemStateChanged(Item item)

{

if (item == cgPrefs)

{

// Is "Select all" option checked ?

if (cgPrefs.isSelected(selectAllIndex))

{

// Set all checkboxes to true

for (int i = 0; i < cgPrefs.size(); i++)

cgPrefs.setSelectedIndex(i, true);

// Remove the check by "Select All"

cgPrefs.setSelectedIndex(selectAllIndex, false);

}

}

}

}

Spacer là thành phần không nhìn thấy, được dùng để định vị trí cho các đối tượng khác trên màn hình hiển thị. Bạn có thể dùng Spacer để chỉ rõ khoãng trắng theo chiều dọc và chiều ngang giữa các thành phần, đơn giản bằng cách chỉ ra chiều dài và chiều rộng cho từng cái. Vì Spacer là thành phần không nhìn thấy nên nó không có sự kiện

b. CustomItem

Thành phần CustomItem cho phép bạn tạo ra những thành phần Item của chính bạn. Những thành phần này cũng giống như những Item khác là cũng có thể được đặt vào trong Form và có thể nhận biết và xử lý sự kiện

CustomItem được vẽ lên màn hình hiển thị bằng phương thức paint(). Vì thế nó sẽ tùy thuộc vào đoạn mã được bạn hiện thực bên trong phương thức paint(). Quá trình tạo ra một đối tượng CustomItem cũng không khác các đối tượng có sẵn trên nền Java. Đoạn mã dưới đây minh họa sườn của việc tạo ra một đối tượng CustomItem

public class NewItem extends CustomItem

{

public NewItem(String label)

{

super(label);

...

}

protected void paint(Graphics g, int awidth, int height)

{

...

}

protected int getMinContentHeight()

{

...;

}

protected int getMinContentWidth()

{

...

}

protected int getPrefContentHeight(int awidth)

{

...

}

protected int getPrefContentWidth(int height)

{

...

}

...

}

Hai lớp được dùng để hiển thị hình ảnh là: ImageImageItem. Image được dùng để tạo ra một đối tượng hình ảnh và giữ thông tin như là chiều cao và chiều rộng, và dù ảnh có biến đổi hay không. Lớp ImageItem mô tả một tấm ảnh sẽ được hiển thị như thế nào, ví dụ tấm ảnh sẽ được đặt ở trung tâm, hay đặt về phía bên trái, hay bên trên của màn hình

MIDP đưa ra 2 loại hình ảnh là loại ảnh không biến đổi và ảnh biến đổi. Một tấm ảnh không biến đổi thì không thể bị thay đổi kể từ lúc nó được tạo ra. Đặc trưng của loại ảnh này là được đọc từ một tập tin. Một tấm ảnh biến đổi về cơ bản là một vùng nhớ. Điều này tùy thuộc vào việc bạn tạo nội dung của tấm ảnh bằng cách ghi nó lên vùng nhớ. Chúng ta sẽ làm việc với những tấm ảnh không biến đổi trong bảng sau.

Các phương thức dựng cho lớp ImageImageItem

• Image createImage(String name)

• Image createImage(Image source)

• Image createImage(byte[] imageDate, int imageOffset, int imageLength)

• Image createImage(int awidth, int height)

• Image createImage(Image image, int x, int y, int awidth, int height, int transform)

• Image createImage(InputStream stream)

• Image createRGBImage(int[] rgb, int awidth, int height, boolean processAlpha)

• ImageItem(String label, Image img, int layout, String altText)

Đoạn mã dưới đây mô tả làm thế nào tạo một tấm ảnh từ một tập tin, và gắn nó với một đối tượng ImageItem và thêm một bức ảnh vào một Form

Form fmMain = new Form("Images");

...

// Create an image

Image img = Image.createImage("/house.png");

// Append to a form

fmMain.append(new ImageItem(null, img, ImageItem.LAYOUT_CENTER, null));

Chúý: PNG là loại ảnh duy nhất được hỗ trợ bởi bất kỳ thiết bị MIDP nào

Đoạn mã dưới đây mô tả việc sử dụng đối tượng Image và đối tượng ImageItem

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class ImageTest extends MIDlet implements CommandListener

{

private Display display; // Reference to Display object

private Form fmMain; // The main form

private Command cmExit; // Command to exit the MIDlet

public ImageTest()

{

display = Display.getDisplay(this);

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

fmMain = new Form("");

fmMain.addCommand(cmExit);

fmMain.setCommandListener(this);

try

{

// Read the appropriate image based on color support

Image im = Image.createImage((display.isColor()) ?

"/image_color.png":"/image_bw.png");

fmMain.append(new ImageItem(null, im, ImageItem.LAYOUT_CENTER, null));

display.setCurrent(fmMain);

}

catch (java.io.IOException e)

{

System.err.println("Unable to locate or read .png file");

}

}

public void startApp()

{

display.setCurrent(fmMain);

}

public void pauseApp()

{

}

public void destroyApp(boolean unconditional)

{

}

public void commandAction(Command c, Displayable s)

{

if (c == cmExit)

{

destroyApp(false);

notifyDestroyed();

}

}

}

0