Tuesday, July 10, 2012

PushButton、事件處理與中文

本篇文章將介紹如何使用BXML建立Push Button並且實作它的事件處理機制,同時也會對中文字的顯示有不同的處理方式。

本專案(由官網取得)可分成二個部份來說明,首先ui.bxml會利用到自訂的命名空間(namespace)-> myex,也因此會在專案中新增一個package名稱為myex,在myex中會建立一個類別PushButtons,它是自訂的Window類別,同時也繼承了Bindable介面,專門用來和使用者介面中的Push Button進行對應,包含了事件處理。

第二部份則是會將ui.bxml放在根目錄底下,它會引用到myex套件中所定義的自訂Window類別PushButtons。另外,程式的進入點仍是NewClass.java,此類別會讀取ui.bxml,並且經由序列化的處理將Window對應到PushButtons。



============範例展示=================================================


============範例展示=================================================


首先是myex#PushButtons.java的原始碼:

//PushButtons.java
package myex;

import java.net.URL;
import org.apache.pivot.beans.Bindable;
import org.apache.pivot.collections.Map;
import org.apache.pivot.util.Resources;
import org.apache.pivot.wtk.*;

public class PushButtons extends Window implements Bindable {

    private PushButton pushButton;

    @Override
    public void initialize(Map<String, Object> namespace, URL location, Resources resources) {
        pushButton = (PushButton) namespace.get("pushButton");

        pushButton.getButtonPressListeners().add(new ButtonPressListener() {

            @Override
            public void buttonPressed(Button button) {
                Alert.alert(MessageType.INFO, "你按了我一下!", PushButtons.this);
            }
        });
    }
}

接下來則是ui.bxml的部份。

<!--ui.bxml-->
<myex:PushButtons title="Push Buttons" maximized="true"
                  xmlns:bxml="http://pivot.apache.org/bxml"
                  xmlns:myex="myex"
                  xmlns="org.apache.pivot.wtk">
    <Border>
        <BoxPane styles="{padding:4, horizontalAlignment:'center',
            verticalAlignment:'center'}">
            <PushButton bxml:id="pushButton" buttonData="請按我!"/>
        </BoxPane>
    </Border>
</myex:PushButtons>

最後則是NewClass.java的原始碼。

//NewClass.java

import java.awt.Font;
import org.apache.pivot.beans.BXMLSerializer;
import org.apache.pivot.collections.Map;
import org.apache.pivot.wtk.*;

public class NewClass implements Application {

    private Window window = null;

    public static void main(String[] args) {
        DesktopApplicationContext.main(NewClass.class, args);
    }

    @Override
    public void startup(Display display, Map<String, String> properties)
            throws Exception {
        //設定佈景主題的字型,若要正常顯示中文要特別注意
        Theme.getTheme().setFont(new Font("PMingLiU", Font.PLAIN, 12));
        BXMLSerializer bxmlSerializer = new BXMLSerializer();
        window = (Window) bxmlSerializer.readObject(NewClass.class, "ui.bxml");
        window.open(display);
    }

    @Override
    public boolean shutdown(boolean optional) {
        if (window != null) {
            window.close();
        }

        return false;
    }

    @Override
    public void suspend() {
    }

    @Override
    public void resume() {
    }
}


後記:
其實也可以使用Pivot內建之annotation來自動對應ui.bxml中的bxml:id,讓程式自動取得各元件。
修改後的PushButtons.java如下:

package myex;

import java.net.URL;
import org.apache.pivot.beans.BXML;
import org.apache.pivot.beans.Bindable;
import org.apache.pivot.collections.Map;
import org.apache.pivot.util.Resources;
import org.apache.pivot.wtk.*;

public class PushButtons extends Window implements Bindable {

    @BXML
    private PushButton pushButton = null;

    @Override
    public void initialize(Map<String, Object> namespace, URL location, Resources resources) {
        //pushButton = (PushButton) namespace.get("pushButton");

        pushButton.getButtonPressListeners().add(new ButtonPressListener() {

            @Override
            public void buttonPressed(Button button) {
                Alert.alert(MessageType.INFO, "你按了我一下!", PushButtons.this);
            }
        });
    }
}


No comments:

Post a Comment