1. 程式人生 > >Vaadin Web應用開發教程 42 資料繫結-Property介面

Vaadin Web應用開發教程 42 資料繫結-Property介面

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                Property介面 為Vaadin資料模型的基本介面,它提供了讀寫單個數據物件的標準API。 一個Property物件總是有資料型別的,儘管它支援可選的資料型別轉換。Property的資料可以為任意的Java物件,Property 也提供了監聽資料變化的事件訊息。

Property的讀寫方法為getValue()和setValue() 。getValue() 返回通用的Object 型別的物件,因此可以強制轉換成所需的資料型別。Property的型別可以通過getType()取得。

Property值發生變化說觸發ValueChangeEvent事件,可以通過ValueChangeListener監聽這個事件。

final TextField tf = new TextField("Name");        // Set the valuetf.setValue("The text field value"
);        // When the field value is edited by the usertf.addListener(new Property.ValueChangeListener() {    public void valueChange(ValueChangeEvent event) {        // Get the value and cast it to proper type        String value = (String) tf.getValue();                // Do something with it
        layout.addComponent(new Label(value));    }});

使用Property介面,一是實現Property介面,而是使用Vaadin內建的兩個Property介面實現:MethodProperty 主要用於Java Bean,而是ObjectProperty用於簡單的Java物件。

與Property介面關係緊密的還有兩個介面Property.EditorProperty.Viewer 可以用來顯示和編譯Property值,大部分的UI元件,尤其是Field元件實現了這兩個介面,因此Field元件可以直接繫結到Property物件,用來顯示或編輯Property資料。

下例使用Label 來顯示一個ObjectProperty 物件

// Have a data modelObjectProperty property =    new ObjectProperty("Hello", String.class);        // Have a component that implements ViewerLabel viewer = new Label();        // Bind it to the dataviewer.setPropertyDataSource(property);
同樣可以使用一個TextField來編輯並顯示一個ObjectProperty物件

// Have a data modelObjectProperty property =    new ObjectProperty("Hello", String.class);        // Have a component that implements ViewerTextField editor = new TextField("Edit Greeting");        // Bind it to the dataeditor.setPropertyDataSource(property);

前面說過所有Field元件也實現了Property介面,因此也可以把Field元件繫結到實現了Property.Viewer介面的UI元件,如Label。下例把一個Label繫結到一個TextField,因此Label顯示的內容會和TextField的值變化而變化。

Label viewer = new Label();viewer.setPropertyDataSource(editor); // The value shown in the viewer is updated immediately// after editing the value in the editor (once it// loses the focus)editor.setImmediate(true);
此外,你也可以自行實現Property介面,然後繫結到Field元件。

class MyProperty implements Property {    Integer data     = 0;    boolean readOnly = false;        // Return the data type of the model    public Class<?> getType() {        return Integer.class;    }    public Object getValue() {        return data;    }        // Override the default implementation in Object    @Override    public String toString() {        return Integer.toHexString(data);    }    public boolean isReadOnly() {        return readOnly;    }    public void setReadOnly(boolean newStatus) {        readOnly = newStatus;    }    public void setValue(Object newValue)            throws ReadOnlyException, ConversionException {        if (readOnly)            throw new ReadOnlyException();                    // Already the same type as the internal representation        if (newValue instanceof Integer)            data = (Integer) newValue;                // Conversion from a string is required        else if (newValue instanceof String)            try {                data = Integer.parseInt((String) newValue, 16);            } catch (NumberFormatException e) {                throw new ConversionException();            }        else             // Don't know how to convert any other types            throw new ConversionException();        // Reverse decode the hexadecimal value    }}        // Instantiate the property and set its dataMyProperty property = new MyProperty();property.setValue(42);        // Bind it to a componentfinal TextField tf = new TextField("Name", property);




           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述