`
newzai
  • 浏览: 13695 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Apache Pivot DataBind(二) -- BindMapping接口

阅读更多

BindMapping介绍

BindMapping 是代表一系列的 BindMapping接口,这组接口用于pivot的 DataBind过程。

BindMapping包含一系列以BindMapping结尾命名的接口。下面列出了大部分pivot所支持的BindMapping接口
TextBindMapping--用于 Label、TextInput和TextArea等控件内容为String的控件。
StateBindMapping--用于 Toggle 按钮(Checkbox和Radio)按钮的三态的绑定。例如某个类型为boolean并且允许空值的数据库字段。
SelectedBindMapping--用于Togglea按钮的选中与非选中状态
ListDataBindMapping--由于 Pivot框架重新实现了一套集合框架。如果业务逻辑使用的List是java.util.List对象时,需要转换为Pivot框架对应的集合对象。
ItemBindMapping--用于ListView等列表组件的选中项的绑定。
SpinnerDataBindMapping 与 ListDataBindMapping 类似
TableDataBindMapping TableView数据内容的绑定,与ListDataBindMapping类似
SelectedRowBindMapping
SelectedDateBindMapping
SelectedColorBindMapping

何时使用BindMapping:符合下面的情况时,不需要使用BindMapping
1. 控件的显示内容(Label,TextInput显示文本,ToggleButton显示 true或者false状态..)与Bean 属性的数据类型相同时
2. Bean属性的数据类型有内置方法可以转换为控件的显示内容的数据类型
 例如 Lable,TextInput的内容为String,因此只要Bean属性的对象支持 toString方法即可。

 
符合以上2点时,用户可以选择不使用BindMapping,pivot框架在调用load和stroe时会使用每个控件的内置BindMapping(无)。

大多数情况下使用BindMapping时,是在数据类型不匹配时,比如TextInput显示一个Integer类型的Bean属性时。此时如果只是load模式,可以不提供。如果是STROE或者BOTH模式需要提供BindMapping。

TextBindMappingInt类 实现了了Integer数据类型到String之间的数据绑定的转换,该类的实例可以用于 Label、TextInput、TextArea等控件内容为String绑定到整数字段的组件。

 

下面代码演示几个常用的 BindMapping

 

import org.apache.pivot.wtk.TextInput.TextBindMapping;


/**
 * 用于实现 string <==> integer 之间的转换
 */
public class TextBindMappingInt implements TextBindMapping {

	@Override
	public String toString(Object value) {
		// TODO Auto-generated method stub
		return value.toString();
	}

	@Override
	public Object valueOf(String text) {
		// TODO Auto-generated method stub
		if ( text == null || text.equals(""))
		{
			return 0;
		}
		return Integer.parseInt(text);
	}

}

/*
TextBindMappingIP 类: 用于Bean属性为整数的IPv4地址时,转换为点分格式的String文本时使用。
*/
import java.net.InetSocketAddress;

import org.apache.pivot.wtk.TextInput.TextBindMapping;

public class TextBindMappingIP implements TextBindMapping {

	@Override
	public String toString(Object value) {
		// TODO Auto-generated method stub
		if ( value instanceof Integer)
		{
			int ip = ((Integer)value).intValue();
			int [] addr = new int[4];

			addr[3] =  (( (ip & 0xFF000000) >>> 24) & 0xFF);
			addr[2] =  ((  (ip & 0x00FF0000) >>> 16) & 0xFF);
			addr[1] =  (( (ip & 0x0000FF00) >>> 8) & 0xFF);
			addr[0] =  (  (ip & 0x000000FF) & 0xFF);
			
		
			
			return (addr[0]+"."+addr[1]+"."+addr[2]+"."+addr[3]);
			
		}
		return null;
	}

	@Override
	public Object valueOf(String text) {
		
		if ( text == null || text.equals(""))
			return 0;
		InetSocketAddress addr = new InetSocketAddress(text, 0);
		byte[] ip = addr.getAddress().getAddress();
		if (ip == null)
		{
			return 0;
		}
		int value = 0;		
		value = 	( ((int)ip[3]) << 24) & 0xff000000
				| ( (int)ip[2] << 16) & 0x00ff0000
				| ( (int)ip[1] << 8) & 0x0000ff00 
				| ((int)ip[0]) & 0x000000ff;
		return value;
	}

}

/*
ItemBindMappingEnum 用于实现 枚举值和控件内容之间的转换,一般用于ListButton的选中项。
*/
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.pivot.collections.List;
import org.apache.pivot.wtk.ListView.ItemBindMapping;

import com.google.protobuf.ProtocolMessageEnum;




public class ItemBindMappingEnum implements ItemBindMapping {

	private String enumName;
	@Override
	public Object get(List<?> listData, int index) {
		// TODO Auto-generated method stub
		try {
			
			//System.out.println(enumName+":"+index);
			Class<?> classObj = Class.forName(enumName);			
			
			Method valueOf = classObj.getMethod("values",  new Class<?>[]{});
			Object [] ar = ((Object[])valueOf.invoke(null, new Object[] { }));
			
			//for( Object e : ar)
			//{
			//	System.out.println(e.toString());
			//}
			if ( index >= ar.length )
			{
				//System.out.println("index error:"+index);
				return ar[0];
			}
			return ar[index];
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

	@Override
	public int indexOf(List<?> listData, Object value) {
		// TODO Auto-generated method stub
		if ( value instanceof ProtocolMessageEnum )
		{
			Enum<?> msgEnum = (Enum<?>)value;
			
			return msgEnum.ordinal();
		}else if ( value instanceof Enum<?>)
		{
			Enum<?> enumValue = (Enum<?>)value;
			
			return enumValue.ordinal();
		}
		return 0;
	}

	public void setEnumName(String enumName) {
		this.enumName = enumName;
	}

	public String getEnumName() {
		return enumName;
	}

}
/*
ListDataBindMappingList 用于 ListView 等控件内容为一个列表时。由于Pivot的控件支持的集合框架为org.apache.pivot.collections中的数据类型,而应用程序一般提供的数据类型都是为 java.util.List的对象,此时ListView等控件无法直接显示内容,因此需要在源数据内容和目标数据内容之间设置一个BindMapping,进行数据类型的转换。默认情况下ListView只能的Item只能显示List的元素类型为ListItem的对象,如果非ListItem的对象必须提供toString方法或者未ListView提供一个适合元素对象的ItemRenderer实例。或许你需要了解更多有关Pivot Renderer的内容。
*/

import org.apache.pivot.collections.ArrayList;
import org.apache.pivot.collections.List;
import org.apache.pivot.wtk.ListView.ListDataBindMapping;
import org.apache.pivot.wtk.content.ListItem;

import com.google.protobuf.ByteString;

import dv.Dvmessage.IPAddress; /*List元素的内容的某种数据类型*/


public class ListDataBindMappingList implements ListDataBindMapping {

	
	private boolean toInteger = false; // 是否把 ListItem 转换为 Integer
	private boolean toByteString = false;
	private boolean toIP = false;
	@Override
	public List<?> toListData(Object value) {
		// TODO Auto-generated method stub
		List<Object> listData = new ArrayList<Object>();
		
		
		if ( value instanceof java.util.List<?>)
		{
			java.util.List<?> jList = (java.util.List<?>)value;
			
			if ( jList.size() == 0 )
			{
				return listData;
			}
			for( Object e : jList)
			{
				if ( toInteger )
				{
					ListItem item = new ListItem(e.toString());
					
					listData.add(item);
				}else if ( toByteString )
				{
					ByteString bs = (ByteString)e;
					String strBs = new String( bs.toByteArray());
					
					ListItem item = new ListItem(strBs);
					listData.add(item);
				}else if ( toIP)
				{
					TextBindMappingIPAndPort textToIP = new TextBindMappingIPAndPort();
					if ( e instanceof IPAddress )
					{
						listData.add( new ListItem(textToIP.toString(e)));
					}
				}
				else
				{
					listData.add(e); /*不做任何类型转换,用户需要提供代对象的 ItemRenderer或者提供 toString方法,元素内容才可以正常显示*/
				}
				
			}
			
		}
		return listData;
	}


	@Override
	public Object valueOf(List<?> listData) {
		// TODO Auto-generated method stub
		java.util.List<Object> jList = new  java.util.ArrayList<Object>();
		if ( listData instanceof List<?>)
		{
			List<?> list = ( List<?>)listData;
			for( Object e: list )
			{
				if ( toInteger )
				{
					if ( e instanceof ListItem )
					{
						ListItem item = (ListItem)e;
						jList.add( Integer.parseInt( item.getText()));
					}
				}else if ( toByteString )
				{
					if ( e instanceof ListItem)
					{
						ListItem item = (ListItem)e;
						jList.add( ByteString.copyFrom( item.getText().getBytes()));
					}
				}else if ( toIP)
				{
					TextBindMappingIPAndPort textToIP = new TextBindMappingIPAndPort();
					if ( e instanceof ListItem )
					{
						ListItem item = (ListItem)e;
						
						jList.add( textToIP.valueOf(item.getText()));
					}
				}
				else
				{
					jList.add(e);
				}
			}
		}
		if ( jList.size() ==  0 )
		{
			return java.util.Collections.emptyList();
		}
		return jList;
	}

	public void setToInteger(boolean toInteger) {
		this.toInteger = toInteger;
	}

	public boolean isToInteger() {
		return toInteger;
	}

	public boolean isToIP() {
		return toIP;
	}

	public void setToIP(boolean toIP) {
		this.toIP = toIP;
	}

	public void setToByteString(boolean toByteString) {
		this.toByteString = toByteString;
	}

	public boolean isToByteString() {
		return toByteString;
	}

}

 

 

 

使用BindMapping,在wtkx文件中引用

<?xml version="1.0" ?>
<Border xmlns="org.apache.pivot.wtk" 
		xmlns:collections="org.apache.pivot.collections" 
		xmlns:content="org.apache.pivot.wtk.content" 
		xmlns:wtkx="http://pivot.apache.org/wtkx" 
		xmlns:bind="cn.dvision.bindMapping" 
		xmlns:renderer="cn.dvision.ui.renderer" 
		xmlns:custom="cn.dvision.ui">
	<content>
		<ScrollPane>
			<view>
			<Form>
				<sections>
					<Form.Section>
						<custom:ListButtonEnumData enumName="dv.Dvenum$IPType" selectedItemKey="type" Form.label="type">
								<selectedItemBindMapping>
									<bind:ItemBindMappingEnum enumName="dv.Dvenum$IPType"/>
								</selectedItemBindMapping>
							</custom:ListButtonEnumData>
						<BoxPane Form.label="ipv4">
							<TextInput textKey="ipv4">
								<textBindMapping>
									<bind:TextBindMappingIP/>
								</textBindMapping>
							</TextInput>
							<Checkbox selectedKey="hasIpv4"/>
						</BoxPane>
						<BoxPane Form.label="ipv6">
							<TextInput textKey="ipv6">
							<textBindMapping>
								<bind:TextBindMappingByteString/>
							</textBindMapping>
							</TextInput>
							<Checkbox selectedKey="hasIpv6"/>
						</BoxPane>
						<BoxPane Form.label="domain">
							<TextInput textKey="domain"/>
							<Checkbox selectedKey="hasDomain"/>
						</BoxPane>
						<TextInput textKey="port" Form.label="port">
							<textBindMapping>
								<bind:TextBindMappingInt/>
							</textBindMapping>
						</TextInput>
					</Form.Section>
					
				</sections>
			</Form>
			</view>
		</ScrollPane>
	</content>
</Border>

 即可:

 

分享到:
评论

相关推荐

    pivot-wtk-skin-terra-2.0.1-build001.zip

    标题"Pivot-WTK-Skin-Terra-2.0.1-build001.zip"提示我们这是一个与Apache Pivot相关的皮肤包,版本为2.0.1的build001。Apache Pivot是一个开源的用户界面开发框架,它允许开发者创建富客户端应用,支持多种平台。...

    ext-d3-pivot-d3-component.zip

    《EXT-D3与Pivot-D3组件深度解析》 EXT-D3与Pivot-D3是JavaScript库中的两个重要组件,它们在数据可视化和数据分析领域扮演着关键角色。EXT-D3结合了EXT JS的用户界面框架与D3.js的数据操作和可视化能力,而Pivot-...

    pivot-luke-5.5.0-luke-release.zip

    "pivot-luke-5.5.0-luke-release.zip" 是一个专门针对Lucene索引库的图形化界面工具,它的全称是Luke,由Java编写,就像数据库管理的得力助手Navicat一样,为Lucene用户提供了直观易用的操作界面。 Luke的主要功能...

    Laravel开发-laravel-pivot-soft-deletes

    `laravel-pivot-soft-deletes`是一个扩展,它允许我们在处理多对多关系的中间表时,应用Laravel的Soft Deletes特性,即“软删除”。这在数据管理中非常实用,因为它并不真正删除记录,而是通过设置一个特定的字段...

    Pivot-2 - MetaTrader 4脚本.zip

    "Pivot-2 - MetaTrader 4脚本.zip"这个文件包含了一个名为"Pivot-2.mq4"的脚本,它是专门为MT4平台设计的,旨在帮助用户计算并显示第二天的枢轴点(Pivot Points),这一技术分析工具对于交易决策至关重要。...

    ngx-pivot-table-源码.rar

    源码rar文件"ngx-pivot-table-源码.zip"包含了该组件的完整开发源代码,可以帮助我们深入了解其工作原理,定制功能,或者进行二次开发。下面我们将深入探讨ngx-pivot-table的相关知识点。 1. **Angular框架**:ngx-...

    vue-pivot-table-数据透视表的vue组件-Vue.js开发

    vue-pivot-table数据透视表Live演示(jsfiddle)的vue组件安装npm install --save @ marketconnect / vue-pivot-table组件此项目vue-pivot-table数据透视表Live演示(jsfiddle)的vue组件npm install --save @ ...

    ^Pivot_PP - MetaTrader 4脚本.zip

    《MetaTrader 4脚本——^Pivot_PP深入解析》 在金融交易领域,MetaTrader 4(MT4)是一款广泛使用的交易平台,它为交易者提供了丰富的技术分析工具和自动化交易功能。本文将深入探讨标题为"^Pivot_PP - MetaTrader ...

    Pivot-2 - MetaTrader 5脚本.zip

    "Pivot-2 - MetaTrader 5脚本.zip"这个压缩包文件,内含一个名为"pivot-2.mq5"的脚本,显然与在MT5平台上实现枢轴点(Pivot Point)计算和分析有关。接下来,我们将深入探讨枢轴点的概念、计算方法以及在MT5中的应用...

    Pivot RS Session - MetaTrader 4脚本.zip

    《Pivot RS Session - MetaTrader 4 脚本详解》 在金融交易领域,MetaTrader 4(MT4)平台是广泛使用的交易平台之一,它提供了丰富的技术分析工具和自动化交易功能。今天我们要探讨的是一个名为"Pivot RS Session...

    Pivot_Fibs - MetaTrader 4脚本.zip

    枢轴点(Pivot Points)是另一项重要的技术分析工具,它基于前一交易日的价格数据计算得出,包括主要枢轴点(PP)、第一支撑(S1)、第一阻力(R1)、第二支撑(S2)和第二阻力(R2)。这些点位可视为市场趋势转换的...

    Fibo Pivot Lines GMT - MetaTrader 4脚本.zip

    《MetaTrader 4中的Fibo Pivot Lines GMT指标详解》 在金融市场交易中,技术分析工具是投资者的重要武器,其中Fibo Pivot Lines GMT是MetaTrader 4(MT4)平台中一款备受推崇的指标。该指标结合了斐波那契回撤和枢...

    Float_Pivot_Digit - MetaTrader 5脚本.zip

    【标题】"Float_Pivot_Digit - MetaTrader 5脚本.zip" 提供了一个MetaTrader 5交易平台的脚本,该脚本旨在提供一个与布林带®(Bollinger Bands)不同的技术分析工具。布林带®是约翰·布林格开发的一种流行的指标,...

    Vue Pivottable-基于jQuery的PivotTable.js的Vue端口-Vue.js开发

    Vue Pivottable这是基于jQuery的PivotTable.js Live Demo链接的Vue端口。运行演示$ git clone https://github.com/Seungwoo321/vue-pivottable.gi Vue Pivottable这是基于jQuery的Vue端口PivotTable.js实时演示链接...

    i4 Pivot_v1 - MetaTrader 4脚本.zip

    《MetaTrader 4平台中的i4 Pivot_v1脚本详解》 在金融交易领域,MetaTrader 4(MT4)是一款广泛使用的交易平台,它为交易者提供了丰富的技术分析工具和自动化交易功能。本文将深入探讨在MT4平台上的一款特殊指标...

    ^Pivot_ResSup - MetaTrader 4脚本.zip

    安装此脚本后,用户可以在图表上看到不同级别的枢轴点、支撑和阻力线,这些线条通常包括主要枢轴点、第一级支撑和阻力、第二级支撑和阻力等。 ^Pivot_ResSup 的特点在于其可视化效果,它将关键点位以不同颜色的线条...

    VTS_Float_Pivot_Smoothed - MetaTrader 5脚本.zip

    《MetaTrader 5中的VTS_Float_Pivot_Smoothed脚本详解》 在金融交易领域,技术分析是投资者常用的一种策略,其中趋势指标扮演着至关重要的角色。MetaTrader 5(MT5)交易平台提供了丰富的工具和指标供交易者进行...

    i4_pivot_v1 - MetaTrader 5脚本.zip

    《MetaTrader 5脚本——i4_pivot_v1深入解析》 MetaTrader 5(MT5)是一款广泛应用于外汇、期货和股票市场的交易平台,它提供了丰富的交易工具和功能,其中包括自定义指标和脚本。在MT5环境中,用户可以编写自己的...

    Pivot_Fibs - MetaTrader 5脚本.zip

    斐波纳契级别线集合 (轴点) 依据日线蜡烛条绘制。

    _Fibo_Pivot_multiVal - MetaTrader 4EA.zip

    多元货币对智能交易,指定在亚洲季交易运行。

Global site tag (gtag.js) - Google Analytics