lwuit 全面剖析

小科學家發表於2009-11-27
在MIDlet中初始化Lwuit 也是唯一使用原有J2me的東西
可以在startApp方法中定義啟動的過程
  public void startApp() {
      //init the LWUIT Display
      Display.init(this);
      //載入資原始檔
try {
   Resources r = Resources.open("/myresources.res");
   UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]) );
} catch (java.io.IOException e) {
}
簡單的使用一個內建Form進行顯示,而無須使用一個而外的類
   Form. f = new Form();
   f.setTitle("Hello World");
   f.setLayout(new BorderLayout());
   f.addComponent("Center", new Label("I am a Label"));
   f.show();
注意使用show方法進行顯示

元件介紹
Component 用於顯示到頁面上的基礎部分,可以理解為DisplayObject,也就是元件部分
Container 用於儲存多個Components的容器型別,提供了佈局的能力

Form. 提供title和menus,並且提供一個content放置Components,並且提供了content的滾動能力
       addComponent,用於新增Components到Content中
提供的一些方法和使用方式
Form. mainForm. = new Form("Form. Title");  //宣告一個帶標題的Form.
mainForm.setLayout(new BorderLayout()); //設定佈局管理器
mainForm.addComponent(BorderLayout.CENTER, new Label(“Hello,World”)); //新增Components元件,
mainForm.setTransitionOutAnimator(CommonTransitions.createFade(400)); //設定動畫
mainForm.addCommand(new Command("Run", 2)); //新增選單命令
mainForm.show(); //顯示Form.
一些技巧  
1:可以使用帶引數的建構函式,設定標題.也可以不設定標題的建構函式
2:addComponent() 方法提供兩個過載,區別在於是否指定佈局位置
3:Transition動畫用於在forms之間進行切換時候觸發
4:Form通過Commands新增選單,根據新增順序排序顯示,其他使用與普通的J2me一樣

Label: 可以同時顯示圖片和文字,設定align佈局,可以通過繼承Label實現擴充套件,如果更復雜,可以使用Button
提供的一些方法和使用方式
Label textLabel = new Label("I am a Label");  //建立一個單行文字
Image icon = Image.createImage("/images/duke.png");
Label imageLabel = new Label(icon);   //建立一個帶圖片的Label
setTextPosition(int alignment); //設定佈局方式,CENTER, LEFT, RIGHT,LEFT,TOP, BOTTOM, LEFT, RIGHT,

Button 可以用於觸發一個點選的事件Action,使用一個ActionListeners 進行監聽
final Button button  = new Button("Old Text");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button.setText("New Text");
}});   //使用匿名的ActionListener介面實現類進行監聽
Button繼承Label, 所以可以設定不同圖文混編的風格,並且提供了三種狀態ollover, pressed, and the default
state

RadioButton  單選按鈕,繼承自Button
RadioButton radioButton = new RadioButton(“Radio Button”);
同樣,也會觸發action
ButtonGroup 用於保證RadioButton只能選中一項
RadioButton rb1 = new RadioButton("First RadioButton in Group 1");
RadioButton rb2 = new RadioButton("Second RadioButton in Group 1");
ButtonGroup group1 = new ButtonGroup();
group1.add(rb1);
group1.add(rb2);
exampleContainer.addComponent(rb1);
exampleContainer.addComponent(rb2);
這裡需要注意,只需要新增addComponent(RadioButton) 到容器中,不需要新增ButtonGroup,只用於後臺管理

CheckBox  多選框,不需要新增到group中,同樣也觸發事件
final CheckBox checkBox = new CheckBox(“Check Box”);
通過checkBox.isSelected() 判斷是否被選中
ComboBox  列表,只允許一個被選中,多用於空間有限時候提供多選項的單選功能
建立需要一個陣列作為資料來源
String[] content = { "Red", "Blue", "Green", "Yellow" };
ComboBox comboBox = new ComboBox(content); //建立一個Combox,在這個建構函式中也是使用List實現
comboBox.setListCellRenderer(new checkBoxRenderer()); //設定renderer 渲染器
也可以使用addActionListener註冊事件

通過實現不同的renderer介面可以給元件提供不同的顯示效果 implements ListCellRenderer

TextArea
例子
TextArea textArea = new TextArea(5, 20, TextArea.NUMERIC);
textArea.setEditable(false);
建構函式的前兩個引數為 總行數和單行長度,第三個引數用於傳遞到本地文字輸入,用於指定限制的型別
可以使用TextArea的常量 ANY,EMAILADDR, NUMERIC, PHONENUMBER, URL, or DECIMAL,PASSWORD, UNEDITABLE, SENSITIVE,NON_PREDICTIVE, INITIAL_CAPS_SENTENCE, INITIAL_CAPS_WORD.也可以使用 | 設定複合約束
預設下可編輯

TabbedPane   通過類似Tab的選項卡方式並排放置一組容器,容器的tab標籤可以使用圖文混編方式
可以使用addTab or insertTab methods 方法新增容器
removeTabAt(int index) 移除容器
tab的索引由0開始
tab標籤可以有四種不同的放置方法  LEFT, RIGHT, TOP or BOTTOM using the setTabPlacement method.
TabbedPane tabbedPane = new TabbedPane(TabbedPane.TOP);
tabbedPane.addTab("Tab 1", new Label("I am a TabbedPane!"));
tabbedPane.addTab("Tab 2", new Label("Tab number 2"));
建構函式使用一個Tab標籤佈局的常量作為引數
addTab,第一個為tab標籤名,第二個引數為直接放置到容器中的內容
Using Lists
List,使用Swing的  MVC模式進行建立
rendered using a ListCellRenderer and are extracted using the ListModel.
使用ListCellRenderer 作為顯示的V  
使用ListModel. 作為資料來源M
其他部分為C進行操作
建立List 有四個建構函式
List()            
List(ListModel model)   //直接例項化ListModel
List(Object[] items) //Array陣列
List(Vector items) //Vector集合
ListModel  也可以分為自定ListModel的實現,以及DefaultListModel
DefaultListModel的使用
String[] items = { "Red", "Blue", "Green", "Yellow" };
DefaultListModel myListModel = new DefaultListModel(items);  //使用Array作為資料來源
ListCellRenderer 渲染器
同樣也可以自定ListCellRenderer的實現,以及DefaultListCellRenderer
自定義的時候,可以通過繼承Libel,來節約開發的速度 ,主要實現兩個方法
public class MyYesNoRenderer extends Label implements ListCellRenderer{
public Component getListCellRendererComponent(List list,
Object value, int index, boolean isSelected) {
((Boolean)value).booleanValue()  來獲取單項的值
}
public Component getListFocusComponent(List list) {
Label label = new label("");
label.getStyle().setBgTransparency(100);
return label;
}}

DefaultListCellRenderer,預設也是使用Label and the ListCellRenderer interface.
實現兩個方法,大體和上面相同
getListCellRendererComponent()
getListFocusComponent()  //選中風格,可以通過修改透明度來表現

新增或移除item
新增的方法有兩種,建立一個ListModel,然後add到list中,重置一個List 使用setModel(ListModel model). 方法
移除的方法有removeItem(int index) or removeAll() methods.
myListModel.addItem(“New Item”); //新增Item
myListModel.removeItem(index);   //刪除Item
myListModel.removeAll(); //刪除所有Item
List 事件 提供了兩種事件 ActionEvent and SelectionsListener
addFocusListener(FocusListener l) 區別於常用的Action
SelectionListener 應該會更有用一些
Fixed Selection Feature 應該是隻有一行的List,不彈出選單的模式 //具體還是demo才知道
通過 setFixedSelection(int fixedSelection) 進行設定
通過四個常量屬性進行設定
FIXED_NONE   //普通的List
FIXED_TRAIL  //靜態
FIXED_LEAD   // ...下面兩種都需要用demo看下區別
FIXED_CENTER
setSmoothScrolling(true) //設定這個屬性,應該是在移動時增加動畫效果,預設為false

Using Dialogs 對話方塊
也提供一個Content,可以存放其他的Components  //對於是否阻塞執行緒,需要了解一下
Dialog提供了五種不同的型別,預設附加了不同的提示音
ALARM //警告
CONFIRMATION //確認
ERROR  //錯誤
INFO  //資訊
WARNING  //警告提示  
當前預設情況下不支援Icon,不過可以自定義Dialog
呼叫dialog的show()方法進行顯示,提供的引數很多,可以選擇合適的過載進行顯示
1:String title  標題
2:Component body 一個單獨的Component
3:String text 用於代替Component body部分
4:Command[] cmds 可以新增Commands
5:int type 設定不同的型別
6:Image icon 新增icon
7:timeout 開啟持續時間,設定成0表示為持續開啟
8:Transition transition 新增動畫
9:String okText 設定Ok按鈕的內容
10:String cancelText 設定cancel的內容
11:int top 設定top所在位置
12:int bottom 設定bottom位置
13:int left  同上
14:int right 同上
15:boolean includeTitle  //需要了解下
show方法可以返回三個型別 void,Command,boolean
boolean值在點選ok時為true, cancel時為null
使用非靜態的方法顯示Dialog
dialog.show(90, 90, 10, 10, true);
關閉dialog  dispose()
需要先show之前設定timer去關閉dialog
Dialog也可以返回一個Command 區別於點選OK按鈕

Using LayoutManagers 使用佈局管理器
已經的佈局管理器
BorderLayout
BoxLayout
FlowLayout
GridLayout
GroupLayout
BorderLayout 邊框佈局模式(東西南北中)
如下五個區域
Center
East
North
South
West
在新增Components的時候進行設定
addComponent(BorderLayout.CENTER, component) // preferred
或者直接使用字串
addComponent(“Center”, component) // valid but error prone  容易出錯
BoxLayout  盒子佈局
包括了 X_AXIS(橫向)  Y_AXIS(豎向)的佈局,並排的方式
BoxLayout boxLayout = new BoxLayout(BoxLayout.X_AXIS);
BoxLayout boxLayout = new BoxLayout(BoxLayout.Y_AXIS);
FlowLayout 流式佈局
這個也是容器預設的佈局方式
橫向佈局,如果長度超出,則自動換行處理
FlowLayout exampleLayout = new FlowLayout();
container.setLayout(exampleLayout);
也可以通過設定建構函式,用於設定佈局起始的位置,比如 Left, Right, or Center
FlowLayout exampleLayout = new FlowLayout(Component.RIGHT);
GridLayout 表格式佈局,可以用於設定九宮圖
可以定製行和列,
GridLayout exampleLayout = new GridLayout(0,2);  //2表示每行顯示兩個單元格cell,0不知道是啥
GroupLayout  // GUI builders 的方式進行佈局,用於NetBeans中的Swing開發

Using Painters
是一個介面,可以用於繪製一個Components的背景,將繪製在Components限定的範圍內
如果要檢視painter繪製結果,需要設定對應的transparency //需要檢視下
painter可以使用絕對座標的繪圖,所以可以重用在其他元件之上
Painter diagonalPainter = new Painter() {
public void paint(Graphics g, Rectangle rect) {
g.drawLine(rect.getX(),
rect.getY(),
rect.getX() + rect.getSize().getWidth(),
rect.getY() + rect.getSize().getHeight());
}
};
注意檢視這裡獲取位置的方法 x y, size width height
使用時候只要給指定的元件設定Painter即可
myComponent.getStyle().setBgPainter(diagonalPainter);
將會自動應用繪圖
記得顯示的呼叫設定透明度  0-255之間
myButton.getStyle().setBgTransparency(100);
Using the Style. Object 設定樣式物件
The Style. object sets colors, fonts, transparency, margin, padding, images, and borders to define the style. for a given component.
使用component.getStyle(). 獲取該物件,可以在執行時候改變
顏色Style.
Foreground color 前景色,主要指文字顏色
Foreground selection color 當元件獲取焦點時,字型的顏色
Background color 背景色
Background selection color  獲取焦點時候的背景色
這裡顏色使用的是RGB(格式為0x000000),不帶alpha透明色,有而外的透明設定在Style中
Font 字型
Transparency 透明度
setBgTransparency進行設定 範圍是0-255之間
Margin and Padding 外邊距和內間距,與css的盒模型一樣
設定的方式
setPadding(int top, int bottom, int left, int right)
setPadding(int orientation, int gap)
setMargin(int top, int bottom, int left, int right)
setMargin(int orientation, int gap)
// orientation can be Component.TOP, BOTTOM, LEFT or RIGHT
這兩個型別方法的區別在於同時設定一個屬性,還是多個屬性
Images  背景色,預設為不限制背景色  使用bgImage 可以用於進行設定
Borders邊框型別
Style. Listener 樣式事件
myComponent.getStyle().addStyleListener(new StyleListener() {
public void styleChanged(String propertyName, Style. source) {}
}}
Painters也可以用於在Style中設定樣式,用於按照要求繪製背景
mycomponent.getStyle().setBgPainter(myPainter);

Theming 皮膚
refreshTheme()方法用於更新所有的樣式,不過手動修改的樣式元素,並不會被更新
設定樣式屬性需要注意的地方
Button.font – font for all buttons //將會作用到所有Button元件的字型
font- 將會影響到所有沒有定義預設值的組components件
這裡不像css那樣有特殊的單獨樣式設定
所有支援的樣式屬性
fgColor   前景色 16進位制的格式
bgColor   背景色 16進位制的格式,也可以使用縮寫ff
bgSelectionColor 背景選中色 16x
fgSelectionColor 前景選中色 16x
bgImage    背景圖片
transparency  設定背景圖樣式透明色 0-255之間,不過目前對背景圖無效
font  分為Bitmap font和System font 定義的方式為Bitmap{myFontName} 和System{face;style;size}
其中系統字型的引數為
face=FACE_SYSTEM,FACE_PROPORTIONALFACE_PROPORTIONAL
style=STYLE_PLAIN,STYLE_BOLD,STYLE_ITALIC
size=SIZE_MEDIUM,SIZE_SMALL,SIZE_LARGE
例如
System{FACE_SYSTEM;STYLE_PLAIN;SIZE_SMALL}
scaledImage      使用boolean值設定背景圖使用平鋪tiled還是重複scaled  預設為true,重複scaled
margin  外邊距,使用四個引數進行設定,代表top, bottom, left, and right. For example, 1, 2, 3, 4
padding 內邊距,使用與margin類似
更新主題時
使用Resources.open("/javaTheme.res");//進行載入
使用UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]));//進行設定
然後可以使用components.refreshTheme 更新元件的樣式
LookAndFeel  DefaultLookAndFeel  似乎是用來定義一些樣式無法修改到的東西,比如滾動條,具體要看API Documention
Resources 資源
LWUIT允許的resource elements的元素包括:
Image Resources       //影像資源
Animation Resources   //動畫資源
Bitmap Fonts       //點陣圖字型
Localization (L10N)   //本地化
Themes        //主題
可以通過專門的編輯器 Resource Editor 或者Ant tasks來建立Resources
Loading a Resource 讀取一個資原始檔
Resources res = Resources.open(“/myresourceFile.res”);
Image i = res.getImage(“imageName”);
圖片可以儲存在res檔案中,或者直接放置在jar檔案中
讀取jar中圖片的方式
Image image = Image.createImage("/images/duke.png");
image的標籤,應該是res配置的時候,可以有三個屬性
name //名稱,預設為檔名
file //影像檔案所在位置
pack //boolean值 ,預設為false ,用於設定是否為Indexed
影像少於256色的時候,可以使用Index image,有利於節約空間
使用indexed image的注意地方
1:因為需要按照畫素的去操作影像,所以在顯示的時候速度比較慢,不過在現在的手機上並不明顯
2:在執行時轉換indexed image將會比較慢,而且可能會失敗,所以應該在編譯時候進行轉換
3:Indexed image並沒有在res檔案中被壓縮,所以res檔案看起來比較大,不過在jar檔案中卻能被很好的壓縮,而且效果比使用png更好
4:indexed images  建立後將不能被改變,比如getGraphics(),詳情看API
Animation Resources
LWUIT支援從Gif檔案中得到動畫效果,儲存的結構類似image structure
StaticAnimation 用於操作動畫..派生自Image,所以可以直接使用在icon或者其他地方
Fonts 字型
LWUIT支援bitmap fonts and system fonts.
System Font  包括了三個引數
Face   //如FACE_SYSTEM, FACE_PROPORTIONAL and FACE_MONOSPACE.
Style  //如STYLE_PLAIN, STYLE_ITALIC, STYLE_BOLD.
Size   //如SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE.
在類的內部可以去建立字型引用
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
同時也可以去建立複合型別的字型(加粗和傾斜)
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD | Font.STYLE_ITALIC,Font.SIZE_MEDIUM);
Bitmap Fonts
三個屬性
name  //在res檔案中,用於程式載入
charset //就是包含的字元,預設為24個字母,數字和一些符號
src //字型檔案TrueType所在位置
size    //字型大小
bold //是否加粗,預設為false
trueType //預設為true,根據src屬性決定是否生效
antiAliasing //預設為true,如果為false表示別名
logicalName  //邏輯名稱,表示不同的字型編碼型別,類似css中使用的4個大區字型
//這裡注意文件中只介紹了使用ant建立Bitmap font,具體還是要檢視API文件
Localization (L10N) 本地化
類似Properties檔案的使用,使用鍵值對的方式儲存在Resources中,只支援使用USASCII嘛的形式
讀取
Hashtable h = bundle.getL10N("localize", "en"); //bundle應該是Resources的例項
UIManager.setResourceBundle(Hashtable)  //可以用於替換當前語言
Themes 皮膚
使用ResourceEdit.exe 可以很方便的進行編輯
載入到程式:
UIManager.getInstance().setThemeProps(res.getTheme(“myTheme”));
編輯器建立的預設就是Bitmap font
使用字型需要注意版權問題... 使用編輯器的時候,可以通過設定 Anti-aliasing 達到反鋸齒的能力
Localization 的使用
Using Transitions and Animations
使用過度效果以及動畫
支援的Transition有,可用於form之間進行的轉換
Slide
Fade
Slide Transition
在第一個form中定義
CommonTransitions.createSlide(int type, boolean forward, int speed)
引數
type  //定義移動的方向,包括了SLIDE_HORIZONTAL or SLIDE_VERTICAL
forward //用一個boolean值表示,不同方向時,起始位置,比如左到右,不過上到下
speed //用int表示的應該是動畫持續的時間,從而在內部計算執行的速度
使用的例子
myForm.setTransitionOutAnimator(CommonTransitions.createSlide(
CommonTransitions.SLIDE_HORIZONTAL, true, 1000));
Fade Transition   漸變效果 (淡入淡出)
CommonTransitions.createFade(int speed)  
引數
speed 同樣表示動畫持續時間,毫秒為單位
例子
themeForm.setTransitionInAnimator(CommonTransitions.createFade(400));

M3G 用於實現3D功能,需要手機的支援  Jsr184
//載入原始碼.注意需要使用jdk1.4進行編譯
呼叫的方式通過  M3G.Callback內部類介面的例項來建立3d動畫物件
class MyCallback implements M3G.Callback {
   ....
   public void paintM3G(Graphics3D g3d) {
      g3d.clear(background);
      g3d.render(world);
   }
   ...
}
在Components元件上使用的方式為
  private M3G.Callback myCallbackInstance = new MyCallback();
   public void paint(Graphics g) {
M3G.getInstance().renderM3G(g, true, 0, myCallbackInstance);
         // draw some stuff in 2D
         ...
   }
注意這裡的區別Graphics3D 和普通的Graphics物件
M3G目前只支援標準的影像檔案,而不支援IndexedImage and RGBImage
Logging 日誌,可以儲存在RMS或者本地檔案中
也分為了四種級別
DEBUG  //預設級別
INFO
WARNING
ERROR
記錄日誌的方式
使用static p(String text) or p(String text,int level) methods.
Log.p(“Finish loading images”)
顯示日誌
Log.showLog();
建立自定義的元件,只要繼承Component物件,然後重寫paint方法即可,類似Canvas的操作

public class MyComponent extends Component {
public void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(getX(), getY(), getWidth(), getHeight());
g.setColor(0);
g.drawString("Hello World", getX(), getY());
}}
在頁面上進行使用的時候,就和其他Components一樣 add到容器之上
需要注意的地方
這裡使用的顏色都是不帶alpha的RGB
使用 getX(), getY() 從容器中獲取Components所在的位置,也包括了 getWidth(), getHeight()
控制元件的大小適宜,通過重寫calcPreferredSize()方法
protected Dimension calcPreferredSize() {
Font fnt = Font.getDefaultFont();
int width = fnt.stringWidth(“99999-9999”)
    int height = fnt.getHeight();
    return new Dimension(width, height);
}
//這裡使用到了獲取字型高度和寬度的方法
事件監聽
和MIDP原有元件一樣,只要重寫對應key事件即可
public void keyReleased(int keyCode) {
if(keyCode >= '0' && keyCode <= '9') {
    char c = (char)keyCode;
        inputString += c;
        repaint();
    }
}
Focus 焦點
Components元件中的事件,要求當前元件獲取焦點後才會觸發
setFocusable(true); //使其獲取焦點
使用LookAndFeel繪製
UIManager.getInstance().getLookAndFeel().drawBorder(g, this,getStyle().getFgSelectionColor(), 2);
不是很明白的例子,在Components中
public void paint(Graphics g) {
UIManager.getInstance().getLookAndFeel().setFG(g, this);
Style. style. = getStyle();
g.drawString(inputString, getX() + style.getPadding(LEFT),
getY() + style.getPadding(TOP));
}
不過一些方法不錯 以及常量, 可能第一個方法是初始化元件中引數的狀態
229136
Background 使用Painter來繪製,允許透明translucent與不透明opaque
對自定義元件新增Animating動畫支援
protected void initComponent() {
    getComponentForm().registerAnimated(this);
}
不能在建構函式中進行註冊
自定義元件的例子
關鍵方法一
  protected Dimension calcPreferredSize() {
      Style. style. = getStyle();
      Font fnt = style.getFont();
      int width = fnt.stringWidth("99999-9999");
      int height = fnt.getHeight();
      height += style.getPadding(Component.TOP) +
style.getPadding(Component.BOTTOM);
      width += style.getPadding(Component.LEFT) +
style.getPadding(Component.RIGHT);
      return new Dimension(width, height);
  }
用於在視窗變化時候獲取合適的顯示效果
主要使用到的方法
1:   Style. style=getStyle(); //獲取當前元件預設樣式物件
2:   style.getPadding(LEFT) //獲取左內邊距
3:   getX(), getY()獲取x,y引數
4:   style.getFont().stringWidth(inputString); 獲取樣式預設字型的寬度,其中inputString為輸入的字串
5:   style.getFont().getHeight() 獲取字型的高度
該方法返回的是 new Dimension(width, height); 物件,需要驗證下有何效果

註冊動畫效果
  protected void initComponent() {
      getComponentForm().registerAnimated(this);
  }

修改動畫效果細節
public boolean animate() {
     boolean ani = super.animate();
     long currentTime = System.currentTimeMillis();
     if (drawCursor) {
         if ((currentTime - time) > 800) {
             time = currentTime;
             drawCursor = false;
             return true;
         }
     } else {
         if ((currentTime - time) > 200) {
             time = currentTime;
             drawCursor = true;
             return true;
         }
     }
     return ani;
}

影響記憶體使用的因素
計算一個圖片在不同手機上的所佔用的記憶體
長  寬   
16 bit: 128 * 128 * 2 = 32,768   一張全屏的圖片所佔用的記憶體
24 bit: 320 * 240 * 4 = 307,200
這裡用的是8的倍數來進行計算, 24位會被當做32位計算
可以使用Indexed images 來代替. 不過缺點是隻支援256色,優點在於更少的記憶體使用率
Display's 的init()方法可以關閉一些佔用記憶體較多的特性
Speed 速度方面

Event Dispatch Thread (EDT) 事件傳送執行緒
Display methods callSerially, callSeriallyAndWait, and  invokeAndBlock. 通過這幾個方法進行呼叫特別的執行緒處

Light Mode 不是很清楚用途
turning off light mode (after Display.init())


元件關係

Component為所有的視覺化元件的父類,在其之下有四個分支

Container (TabbedPane,Form(Dialog))

TextArea

List (ComboBox)

Label     (Button(RadioButton,CheckBox))



Container 可以容納包括容器在內的其他元件.容器內的元件排列由 佈局管理器 負責。


Form. 是頂部有 標題欄(Title Bar)、底部是 選單欄(Menu Bar)的容器,標題欄可以寫入窗體名稱,選單欄可以寫入命令和選單。兩欄之間為內容窗格,該窗格用於放置窗體上的元件。


TabbedPane 允許大量部件組放置在同一個空間。每組部件都有一個與之關聯的選項卡,使用者只能看到與選定選項卡相對應的部件組。預設的選項卡位置在窗格頂部。但是,也可 以將其置於左側、右側或者窗格下部


對話方塊

Dialog 是一個“永遠處於頂層”的元件。預設情況下,對話方塊是情景式的 (modal),在銷燬之前它將阻塞呼叫執行緒


分為五種型別

Alarm

Confirmation

Error

Info

Warning


對話方塊可用於向使用者傳遞執行時資訊,以及收集使用者反饋。不同型別的對話方塊在顯示時將會有相應的提示音。可以向對話方塊中加入圖示,以圖形方式指示其型別



標籤和按鈕


Label 用於顯示影像和文字,但顯示內容不能被選中,也不能和使用者進行互動。可通過許多對齊功能來精確放置標籤和標籤上影像的相關文字。


Button 類擴充套件自 Label 類。按鈕有自己的 狀態,當它被選中和單擊時會生成一個 操作事件。也可以附帶圖片


按鈕的三種狀態如下:

Rollover:這通常相當於按鈕處於選中狀態,獲得焦點。

Pressed:當按鈕被單擊或按下時。

Default:當按鈕既未被選中,也未被單擊時。


Button 類有兩個子類:RadioButton 和 CheckBox。RadioButton 具有 Button 類的全部功能。此外,Radiobutton 可以被新增到 ButtonGroup 中,ButtonGroup 類允許它在組內保持獨佔選定狀態,只能選中一個;


checkBox 核取方塊不能是按鈕組的一部份,其他和HTML等元件中的功能一樣


文字域 TextArea


TextArea 是顯示可編輯文字的元件。可使用本機系統編輯器對其進行編輯,這通常會開啟一個新的螢幕.



List 列表


LWUIT 採用了 模型-檢視-控制器 體系結構

列表的資料結構由 ListModel 介面表示。所以列表不會侷限於特定資料結構,它可以顯示任何實現了該介面物件的資訊。同樣,列表的呈現由實現 ListCellRenderer 的類來完成,因此,開發人員可建立各種型別的外觀。


ComboBox 是一種節省空間的元件,單擊時會有下拉選單顯示。使用者可以從列表中選擇某項。由於ComboBox 擴充套件自 List,您也可以將自定義模型和呈現程式用於組合框,也就是新增自定義的顯示,也就是上面所描述的.



底層資原始檔---影像資源,動畫資源,點陣圖字型,本地化資源包,主題,可以使用資源編輯器進行管理


佈局管理器 ,如下五種

BorderLayout

BoxLayout

FlowLayout

GridLayout

GroupLayout


Style. 樣式設定,基於元件的樣式 (getStyle()),也就是類似HTML中的css設計

顏色

字型

影像

邊距

填充

透明度


當生成某個元件後,將會構建一個預設的 Style. 物件,也可以使用theme主題,生成全域性預設的皮膚主題


Painter 介面允許您在元件背景上繪製圖形,LWUIT 包提供了兩個類來實現此介面 //需要研究下


BackgroundPainter:根據其自身樣式繪製元件背景。

PainterChain:建立一系列產生圖層效果的 Painter,每個 Painter 負責繪製一個元素。


UIManager


LWUIT 的一個重要特性是可從單一位置管理整個應用程式的外觀。UIManager 類可以調整應用程式的視覺方面。該元件可以確保每個應用程式只有一個 UIManager 物件。此類的方法可以在所有元件上應用同樣的外觀,從而動態本地化使用者介面。



LookAndFeel

負責應用程式各種呈現方式的介面。通過重寫此介面的相應方法,可以完全定製應用程式的外觀。LookAndFeel 在 LWUIT 包中的具體實現是 DefaultLookAndFeel,該類控制預設外觀的實際呈現。通過使用 UIManager 的 setLookAndFell方法,可以插入 LookAndFell 的自定義實現。


窗體之間的轉換 -----Effect


LWUIT 庫支援現有窗體與將要顯示的窗體之間的、不同模式的轉換實現。這種轉換的基本實現是通過 Animation 介面、Motion 類、Transition 類、CommonTransitions 類和 Transition3D 類的機制來完成的,可以在 com.sun.lwuit.animations 包中找到它們


動畫的實現過程


Animation 接 口定義了動畫類物件。由於所有元件都實現了 Animation

元件必須在父窗體中對其自身進行註冊,以便獲得動畫回撥,從而執行動畫任務。如要停止這些回撥,元件必須明確取消註冊自身


transition 是一個抽象類,該類表示從一個窗體過渡到另一個窗體時的動畫,兩個具體子類的例子


CommonTransitions:含有實現 Slide 和 Fade 兩種通用轉換型別的方法。

Transition3D:執行轉換(Cube、飛入 和 旋轉),要求裝置支援 3D 圖形 //這裡的3D效果可以考慮刪除,支援不好


Motion 是用來實現運動效果的類。內建的運動型別包括 linear、spline 和 friction。可以通過實現 Motion 的子類來實現其他型別的運動效果



載入主題時,就會從res中讀取主題資料,從而對所有相應的屬性的元件進行更新,不過隻影響未被手動修改的屬性


其他功能


日誌記錄

com.sun.lwuit.util.Log 類提供了將日誌資訊寫入 日誌 檔案(在 root 目錄中建立)的方法,也可以在 Form. 和控制檯上顯示日誌資訊。可以通過 FileConnection API 來使用儲存在日誌檔案中的資訊。


3D功能: 在某些移動裝置上支援可選的硬體加速,以提高其效能。



LWUIT的Button使用以及窗體佈局


佈局

BorderLayout //按照東西南北中的部分方式

BoxLayout-X   //從左向右的佈局

BoxLayout-Y   //從上向下的佈局

FlowLayout    //從左到右,滿時會自動換行

GridLayout    //表格式佈局


Demo中還涉及了新增元件的方式,均使用lwuit下的元件

public Form. form. = new Form("LayoutDemo"); //新建一個Form


//BorderLayout,就是把窗體佈局分成東、南、西、北、中這5部分

        border = new Button("BorderLayout");

        //顧名思義,設定按鈕背景的透明度,範圍0~255,可以用Util的資源編輯器來預先修改

        border.getStyle().setBgTransparency(100);

        //每個button都需要設計監聽事件

        border.addActionListener(this);


對於事件監聽的處理和ActionListener一樣 實現一個介面


這裡通過事件源發出的資訊進行處理

public void actionPerformed(ActionEvent arg0) {

        String button_name=((Button)(arg0.getSource())).getText();

        if(button_name.equals("BorderLayout"))

        {}


進行顯示的時候

Display.init(this);

Resources r;

try {

r = Resources.open("/javaTheme.res");

UIManager.getInstance().setThemeProps(

r.getTheme(r.getThemeResourceNames()[0]));

LayoutDemo l = new LayoutDemo();

l.form.show();

} catch (IOException e) {

e.printStackTrace();

}

進行init,載入資原始檔,顯示元件


動態修改佈局方式

    form.setLayout(new BoxLayout(BoxLayout.X_AXIS));

            form.setScrollable(true);

            addComponents(form);

            form.show();


通過繼承Component來獲取繪圖的操作


com.sun.lwuit.Command用於類似原有的Command的實現


新增元件後需要使用

form.addComponent(cdlabel); //進行新增到頁面之上


Radio組 單選組

final RadioButton thirdRB = new RadioButton("Third RadioButton");

form.addComponent(thirdRB);


新增到組

public ButtonGroup group = new ButtonGroup();

group.add(firstRB);



設定樣式

Label cdlabel = new Label("CheckBox:");

cdlabel.getStyle().setMargin(Component.BOTTOM, 0);


事件處理機制

ActionListener用於處理元件的事件


firstCB.addActionListener(listener);

用於註冊元件事件監聽器

ActionListener listener = new ActionListener() {

public void actionPerformed(ActionEvent arg0) {}

} // 匿名介面的形式進行


設定全域性監聽器,需要保證當前類實現了ActionListener介面

form.setCommandListener(this);

public void actionPerformed(ActionEvent arg0) {

    //這裡處理Command 以及 判斷ButtonGroup所選中的RadioButton

        Command cmd=arg0.getCommand();}


顯示提示框

Dialog.show("Rb_Cb_Lb",str, "OK", null);


Tab元件

TabbedPane tp = new TabbedPane();

//addTab可以為頁面新增控制元件,也可以是Container(相當於容器的控制元件)

tp.addTab("Tab 1", new Label("Welcome to TabbedPane demo!"));


也可以新增新的容器

Container radioButtonsPanel = new Container(new BoxLayout(BoxLayout.Y_AXIS));

tp.addTab("Tab 2", radioButtonsPanel)

同時該容器內也可以繼續新增元件

radioButtonsPanel.addComponent(RightRB);


列表List元件

DefaultListModel myListModel = new DefaultListModel(str_list);

        List list = new List(myListModel);

提供一個陣列生成DefaultListModel的例項,也可以傳遞陣列直接給List的建構函式


list.addActionListener(this); 進行事件註冊


新增元件可以有兩個引數 佈局和元件

form.addComponent(BorderLayout.NORTH,button);


對話方塊


Dialog 是一個“永遠處於頂層”的元件。預設情況下,對話方塊是情景式的 (modal),在銷燬之前它將阻塞呼叫執行緒。對話方塊共有以下 5 種型別:


Alarm

Confirmation

Error

Info

Warning

原地址:http://nottiansyf.垃圾廣告.com/blog/377062


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21359667/viewspace-620863/,如需轉載,請註明出處,否則將追究法律責任。

相關文章