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

T5中使用自定义SelectMultiple组件

阅读更多

刚把东西都整理好了,已经贴进来了,不小心又给弄没了,气死我了,这次只把主要部分写出来,过程就不做过多描述,看代码是最直接的事情:

1,SelectMultiple类:

import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.OptionModel;
import org.apache.tapestry.SelectModel;
import org.apache.tapestry.SelectModelVisitor;
import org.apache.tapestry.annotations.BeforeRenderTemplate;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.corelib.base.AbstractField;
import org.apache.tapestry.ioc.annotations.Inject;
import org.apache.tapestry.services.FormSupport;
import org.apache.tapestry.services.Request;

import xxx.models.SelectMultipleModelRenderer;

/**
 * Multiple Select组件
 * 
 * @author guanyq
 * 
 */
public final class SelectMultiple extends AbstractField {
	private class Renderer extends SelectMultipleModelRenderer {

		public Renderer(MarkupWriter writer) {
			super(writer);
		}

		@Override
		protected boolean isOptionSelected(OptionModel optionModel) {
			Object value = optionModel.getValue();
			return (_values == null) ? false : hasValue(value);
		}
	}

	private boolean hasValue(Object obj) {
		boolean bo = false;
		for (int i = 0; i < _values.length; i++) {
			if (_values[i].equals(obj)) {
				bo = true;
				break;
			}
		}
		return bo;
	}

	// 请求request
	@Inject
	private Request _request;

	// model
	@Parameter(required = true)
	private SelectModel _model;

	// 提交页面时,提交的值
	@Parameter
	private Object[] _values;

	// 选择框行数
	@Parameter
	private String _size;

	// 选择框样式
	@Parameter
	private String _style;

	@Override
	@SuppressWarnings("unchecked")
	protected void processSubmission(FormSupport formSupport, String elementName) {
		_values = _request.getParameters(elementName);
	}

	void afterRender(MarkupWriter writer) {
		writer.end();
	}

	void beginRender(MarkupWriter writer) {
		if (_size != null && _style != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple", "size", _size, "style", _style);
		else if (_size != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple", "size", _size);
		else if (_style != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple", "style", _style);
		else if (_style != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple");
	}

	@BeforeRenderTemplate
	void options(MarkupWriter writer) {
		SelectModelVisitor renderer = new Renderer(writer);

		_model.visit(renderer);
	}

	void setModel(SelectModel model) {
		_model = model;
	}

	void setValues(Object[] values) {
		_values = values;
	}

}

 这个类切记要放在项目的components包下,否则页面使用时找不到该组件

 

2,SelectMultipleModelRenderer类:

import java.util.Map;

import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.OptionGroupModel;
import org.apache.tapestry.OptionModel;
import org.apache.tapestry.SelectModelVisitor;

/**
 * 页面元素输出类
 * 
 * @author guanyq
 * 
 */
public class SelectMultipleModelRenderer implements SelectModelVisitor {
	private final MarkupWriter _writer;

	public SelectMultipleModelRenderer(final MarkupWriter writer) {
		_writer = writer;
	}

	public void beginOptionGroup(OptionGroupModel groupModel) {
		_writer.element("optgroup", "label", groupModel.getLabel());

		writeDisabled(groupModel.isDisabled());
		writeAttributes(groupModel.getAttributes());
	}

	public void endOptionGroup(OptionGroupModel groupModel) {
		_writer.end();
	}

	@SuppressWarnings("unchecked")
	public void option(OptionModel optionModel) {
		// 取得optionModel中存放的对象值(option的value)
		Object optionValue = optionModel.getValue();
		// 取得optionModel中存放的对象key(option的text)
		String optionLabel = optionModel.getLabel();

		_writer.element("option", "value", optionValue.toString());

		if (isOptionSelected(optionModel))
			_writer.attributes("selected", "selected");

		writeDisabled(optionModel.isDisabled());
		writeAttributes(optionModel.getAttributes());

		_writer.write(optionLabel);

		_writer.end();
	}

	private void writeDisabled(boolean disabled) {
		if (disabled)
			_writer.attributes("disabled", "disabled");
	}

	private void writeAttributes(Map<String, String> attributes) {
		if (attributes == null)
			return;

		for (Map.Entry<String, String> e : attributes.entrySet())
			_writer.attributes(e.getKey(), e.getValue());
	}

	protected boolean isOptionSelected(OptionModel optionModel) {
		return false;
	}

}

 

3,GenericSelectionModel类:

import java.util.ArrayList;
import java.util.List;

import org.apache.tapestry.OptionGroupModel;
import org.apache.tapestry.OptionModel;
import org.apache.tapestry.internal.OptionModelImpl;
import org.apache.tapestry.ioc.services.PropertyAccess;
import org.apache.tapestry.util.AbstractSelectModel;

/**
 * 
 * @author guanyq
 * 
 * @param <T>
 */
public class GenericSelectionModel<T> extends AbstractSelectModel {

	// option text
	private String labelField;

	// option value
	private String keyField;

	// 组装option的对象list
	private List<T> list;

	// 获取对象属性对象
	private final PropertyAccess adapter;

	public GenericSelectionModel(List<T> list, String labelField, String keyField, PropertyAccess adapter) {
		this.labelField = labelField;
		this.keyField = keyField;
		this.list = list;
		this.adapter = adapter;
	}

	public List<OptionGroupModel> getOptionGroups() {
		return null;
	}

	public List<OptionModel> getOptions() {
		if (list == null) {
			return null;
		}
		List<OptionModel> optionModelList = new ArrayList<OptionModel>();
		for (T obj : list) {
			if (labelField == null || labelField.equals("") || keyField == null || keyField.equals("")) {
				optionModelList.add(new OptionModelImpl(obj + "", false, obj, new String[0]));
			} else {
				optionModelList.add(new OptionModelImpl(adapter.get(obj, labelField) + "", false, adapter.get(obj, keyField) + "", new String[0]));
			}
		}
		return optionModelList;
	}
}

  2和3两个类可以随便放在你想放的位置,只要程序能找到

页面类使用方法:

//原数据列表	

@SuppressWarnings("unchecked")
	public GenericSelectionModel getActSelect() {
		return new GenericSelectionModel<Act>((List) col, "alias", "ActId", adapter);	}

//空数据列表(选中后的保存列表)

	@SuppressWarnings("unchecked")
	public GenericSelectionModel getNullSelect() {
		return new GenericSelectionModel<Act>(null, "", "", null);
	}

 注意页面类要引入 

@Inject
 private PropertyAccess adapter;

 

其中col中存放的的是bean列表,如Act列表值,alias是需要在select中显示的text,ActId是select中的value(这2个值都是通过adapter读取bean获得对应值)

 

tml文件是否方法:

<!---原数据列表->
<t:selectmultiple t:id="select1" model="ActSelect" size="4" style="literal:width:120px"/>

<!---空数据列表->
<t:selectmultiple values="ActIds" t:id="select2" model="NullSelect" size="4" style="literal:width:120px">

 其中ActIds在页面类中定义一个list接受提交值即可

 

顺便贴出js代码:

/**
 * 多选下拉框,添加选项
 */
function addmen(){
    var d = document.getElementById('select1');
    var s = document.getElementById('select2');
    for (var i = 0; i < d.options.length; i++) {
        if (d.options[i].selected) {
            var obj = new Option(d.options[i].text, d.options[i].value);
            s.options.add(obj);
            d.removeChild(d.options[i]);
        }
    }
    return false;
}

/**
 * 全部添加
 */
function allmen(){
    var d = document.getElementById('select1');
    var s = document.getElementById('select2');
    for (var i = 0; i < d.options.length; i++) {
        s.options.add(new Option(d.options[i].text, d.options[i].value));
    }
    for (var i = d.options.length - 1; i >= 0; i--) {
        d.removeChild(d.options[i]);
    }
}

/**
 * 取消选中项
 */
function returnmen(){
    var d = document.getElementById('select1');
    var r = document.getElementById('select2');
    for (i = 0; i < r.options.length; i++) {
        if (true == r.options[i].selected) {
            var obj = new Option(r.options[i].text, r.options[i].value);
            r.removeChild(r.options[i]);
            d.options.add(obj);
        }
    }
    return false;
}

 

分享到:
评论

相关推荐

    东风风行T5 EVO汽车使用手册用户说明书pdf电子版下载.pdf

    东风风行T5 EVO是一款汽车产品,本部分的知识点将围绕这款汽车的使用手册展开,手册中涉及了汽车的安全驾驶、操作指南、保养维护等详细信息,旨在帮助车主更好地了解和使用车辆,确保行车安全。 首先,手册开头部分...

    爱威T5+ 效果器 调试软件

    爱威T5+作为一款高端的效果器,内置了多种先进的音频处理算法,能够满足专业录音室、舞台演出、家庭工作室等多种环境的使用需求。 该调试软件的界面通常会包含各种模块,如均衡器(EQ)模块,允许用户通过调整不同...

    hive的自定义函数

    2. **调用函数**:在Hive查询中使用注册的UDF,例如`hive&gt; select my_lower(col) from a;`。 3. **删除函数**:如果不再需要该函数,可以使用`DROP TEMPORARY FUNCTION t5m;`命令删除。 ##### 4.3 通过修改源码集成...

    基于T5-small的问答模型 它实际上是QuestEval指标的一个组成部分,但可以按原样独立使用,仅用于 QA

    T5-Small是T5家族中较小的版本,它在计算资源有限的情况下提供了一种平衡性能和效率的选择。尽管规模较小,但它依然保留了T5模型的核心特性,即通过将所有任务视为文本生成任务来统一处理。在问答任务中,T5-Small会...

    友价T5最新版商城免签约支付插件免费下载个人也可签约使用

    在这个场景中,我们关注的是"友价T5最新版商城免签约支付插件",这是一款允许个人商家无需经过传统金融机构的复杂签约流程就能接入支付功能的软件组件。 在电商领域,支付接口的签约通常涉及到繁琐的手续,包括企业...

    T5LCFG汇总(仅参考)20200219_DWIN迪文T5L配置文件CFG_源码

    总的来说,这个资源对于正在使用或计划使用DWIN迪文T5L系列显示屏的开发者来说是极其宝贵的。它不仅提供了现成的配置参考,还能帮助开发者快速理解和掌握屏幕配置的方法,从而更快地实现产品的原型设计和功能调试。...

    FUJIFILM富士X-T5 系列中文手册.pdf

    手册还引入了符号与编辑惯例,帮助用户理解和解读指南中的特殊标记,以及专业术语的定义,确保用户能够无障碍地学习和使用相机。 总之,《FUJIFILM富士X-T5系列中文手册》是一份全面且实用的参考资料,不仅适合新手...

    SUN T5-4 固件包 SUN T5-4 固件包

    《SUN T5-4 固件包详解与应用》 在IT领域,固件是计算机硬件设备中存储的控制程序,它对于系统的稳定运行...对于任何拥有SUN T5-4服务器的企业或数据中心来说,理解和掌握固件包的使用方法是运维工作的重要组成部分。

    T5L DGUSII 应用开发指南202007101

    这一章深入探讨了T5L产品的DGUS II开发流程,包括图形界面设计、程序编写、调试工具使用等方面,帮助开发者理解整个开发流程。 ### 第三章(假设存在)DGUS II 编程基础 #### 3.x DGUS II语言及编程 这部分会介绍...

    迪文屏幕T5L DGUSII应用开发指南

    例如,T5L可能表示这是一款5英寸的屏幕,而DGUSII则标识了其使用的软件平台。 在硬件连接部分,接线和供电是基础步骤。接线时,开发者需要按照屏幕的接口定义,正确连接电源、串口以及其他必要的接口,如I/O引脚。...

    迪文串口屏T5UIC1开发资料.rar

    7. **开发流程**:使用这些资料,开发者首先需要了解T5UIC1的硬件接口和基本操作,然后使用SDK中的工具和库来编写控制代码,最后将代码烧录到主控器中,通过串口与屏幕进行通信,实现所需的显示效果和交互功能。...

    2014款沃尔沃S60_T5_汽车使用手册用户操作图解驾驶指南车主车辆说明书电子版.pdf

    综上所述,《2014款沃尔沃S60 T5 汽车使用手册》是一份全面的车主指南,它为车主提供了所有必要的信息,帮助他们充分利用车辆的各种特性,并确保在驾驶过程中的安全和便捷。通过详细阅读和遵循手册中的指示,车主...

    Baidu-T5Player-SDK-Web-v2.1.4.zip

    1. **引入资源**:将解压后的T5Player SDK文件夹中的`t5player.min.js`和相关CSS文件引入到网页中。 2. **创建容器**:在HTML中添加一个用于承载播放器的div元素。 3. **初始化播放器**:通过JavaScript调用T5Player...

    DGUS_V7624_T5L屏开发软件DWIN_

    这个软件适用于将T5L屏作为DGUS2系统的一部分来使用的情况。 【描述】中提到的"DWIN迪文T5L屏开发软件"是指DWIN公司为开发者设计的一款专业工具,用于创建和调试T5L显示屏的应用程序。在DGUS2平台上,这个软件能够...

    T5贴片二极管规格书.pdf

    【T5贴片二极管】是电子元器件中的一种,属于快速开关二极管,其型号为1N4448W。该二极管采用塑封塑料体设计,端子为可焊镀铅,符合MIL-STD-750标准的2026方法,便于自动插入和表面安装。二极管的极性在壳体上有明确...

    迪文T5L Keil C51项目模板.rar

    本压缩包“迪文T5L Keil C51项目模板.rar”提供了在Keil环境中开发迪文T5L微控制器项目的模板,帮助开发者快速搭建工程,节省时间和精力。 1. **Keil C51 IDE**:Keil C51是8051系列MCU的专用开发工具,提供了友好...

    T5写频软件

    "特易通T5写频软件"是一款专为特易通T5系列对讲机设计的频率编程工具,主要用于设置和管理对讲机的工作频率、信道、编码方式等通信参数。这款软件使得用户无需专业知识就能轻松进行对讲机的个性化配置,极大地提高了...

    T5模型,经典模型原理

    ### T5模型——自然语言处理中的经典模型原理详解 #### 一、T5模型概述 T5模型(Text-to-Text Transfer Transformer),是由Google Research在2020年提出的一种创新性的自然语言处理(NLP)模型。该模型旨在通过...

Global site tag (gtag.js) - Google Analytics