being 2008-06-17
刚把东西都整理好了,已经贴进来了,不小心又给弄没了,气死我了,这次只把主要部分写出来,过程就不做过多描述,看代码是最直接的事情:
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; }