Vaadin Web應用開發教程 42 資料繫結-Property介面
阿新 • • 發佈:2018-11-08
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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.Editor和Property.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);