单据开发-业务单据Edit界面代码中篇(GUI端)
金蝶云社区-黒白
黒白
9人赞赏了该文章 1,216次浏览 未经作者许可,禁止转载编辑于2022年04月08日 08:47:39

关注公众号获取更多金蝶EAS开发方面的内容

公众号.jpg

因论坛版权要求,部分图片无法显示,可以直接方位微信公众号链接

https://mp.weixin.qq.com/s/PkKrj8UQYMh02L7iSEW4AA

本篇文档介绍业务单据Editt界面的一些常用监听事件开发

控件的监听一般有两种方式添加

1、通过元数据添加

2、通过代码添加

通过元数据添加相对简单,本篇文章主要讲解通过代码添加监听


01


通过元数据添加监听


操作步骤:

1、打开单据所对应的EditUI界面。

2、选中需要添加事件的控件。

3、打开属性窗口,选中"事件"页签

4、根据Event名称,在Mehod Name列双击之后保存

5、发布对应的UI界面

image.png





02



重写方法添加逻辑


操作步骤:

1、打开EditUI界面所对应的java代码界面。

2、根据Mehod Name 重写方法名称

image.png





 

03


通过代码添加监听

       /**
     * output loadFields method
     */
    public void loadFields()
    {
    	detachListeners(); //添加监听
        super.loadFields();
        attachListeners(); //删除监听
    }
    /**
     * 删除监听
     */
    protected void detachListeners() {
		removeDataChangeListener(prmtcompany); //公司
		removeDataChangeListener(prmtdept); //部门
		removeDataChangeListener(txtamount); //金额
		removeDataChangeListener(kdtEntrys); //分录
	}
	/**
	 * 添加监听
	 */
	protected void attachListeners() {
		addDataChangeListener(prmtcompany); //公司
		addDataChangeListener(prmtdept); //部门
		addDataChangeListener(txtamount); //金额
		addDataChangeListener(kdtEntrys); //分录
	}
    /**
     * 添加监听
     * @param com
     */
	protected void addDataChangeListener(JComponent com){
		if(com==null) return;
		final String shortCutName = com.getName();
		//下拉框
		if(com instanceof KDComboBox){  //判断控件类型
			KDComboBox cb = (KDComboBox) com; //转化
			cb.addItemListener(new ItemListener(){  //添加监听
				public void itemStateChanged(ItemEvent e) {
					dataChangeControl(shortCutName,e);  //监听具体处理方法
				}
			});
		}else if(com instanceof KDPromptBox){
			//F7控件
			KDPromptBox prmt = (KDPromptBox) com;
			prmt.addDataChangeListener(new DataChangeListener(){
				public void dataChanged(DataChangeEvent e) {
					dataChangeControl(shortCutName,e);
				}
			});
		}else if(com instanceof KDTable){
			//分录表格控件
			KDTable table = (KDTable) com;
			table.addKDTEditListener(new KDTEditAdapter() {
	            public void editStopped(KDTEditEvent e) {
	            	dataChangeControl(shortCutName,e);
	            }
	        });
		}else if(com instanceof KDFormattedTextField){
			//金额控件
			KDFormattedTextField numberText = (KDFormattedTextField) com;
			numberText.addDataChangeListener(new DataChangeListener(){
				public void dataChanged(DataChangeEvent e) {
					dataChangeControl(shortCutName,e);
				}
			});
		}else if(com instanceof KDCheckBox){
			//单选框
			KDCheckBox box = (KDCheckBox)com;
			box.addChangeListener(new ChangeListener() {
	            public void stateChanged(ChangeEvent e) {
	            	dataChangeControl(shortCutName,e);
	            }
	        });

		}
		//只是添加的常用的监听, 也可以自己加入 日期控件  和文本控件的监听
		 
	}
	/**
	 * 删除监听
	 * @param com
	 *注意 addDataChangeListener 中手动添加的监听 需要在此处进行删除
	 */
	protected void removeDataChangeListener(JComponent com){
		if(com==null) return;
		if(com instanceof KDComboBox){
			//下拉框
			ItemListener[] listeners = com.getListeners(ItemListener.class);
			for(int i=0;i<listeners.length;i++){
				((KDComboBox)com).removeItemListener(listeners[i]);
			}
		}else if(com instanceof KDPromptBox){
			//F7
			KDPromptBox box = (KDPromptBox) com;
			DataChangeListener[] listeners2 = box.getListeners(DataChangeListener.class);
	        for(int i = 0; i < listeners2.length; i++){
	        	box.removeDataChangeListener((DataChangeListener) listeners2[i]);
	        }
		}else if(com instanceof KDTable){
			//分录
			KDTable tb = (KDTable) com;
			KDTEditListener[] listeners2 = tb.getListeners(KDTEditListener.class);
	        for(int i = 0; i < listeners2.length; i++){
	        	tb.removeKDTEditListener((KDTEditListener) listeners2[i]);
	        }
		}else if(com instanceof KDFormattedTextField){
			//金额
			DataChangeListener[] listeners = com.getListeners(DataChangeListener.class);
			for(int i=0;i<listeners.length;i++){
				((KDFormattedTextField)com).removeDataChangeListener(listeners[i]);
			}
		}else if(com instanceof KDCheckBox){
			//单选框
			ChangeListener[] listeners = com.getListeners(ChangeListener.class);
			for(int i=0;i<listeners.length;i++){
				((KDCheckBox)com).removeChangeListener(listeners[i]);
			}
		}
	}
    /**
     * 监听处理方法
     * @param shortCut
     * @param e
     */
	private void dataChangeControl(String shortCut,EventObject e){
		//根据shortCut 判断控件,并进入具体处理逻辑
		if(shortCut.equals(prmtcompany.getName())){
			prmtcompany_DataChange( );
		}if(shortCut.equals(kdtEntrys.getName())){
			kdtEntrys_editStoped((KDTEditEvent) e);
		}
	}
    /**
     * 公司值变监听事件
     */
	private void prmtcompany_DataChange() {
		//获取控件的值
		//CompanyOrgUnitInfo comInfo= (CompanyOrgUnitInfo)prmtcompany.getValue(); 
		//对控件设置值
		//prmtcompany.setValue(new CompanyOrgUnitInfo());
	}
	/**
	 * 分录编辑停止事件
	 * @param e
	 */
	private void kdtEntrys_editStoped(KDTEditEvent e) {
		int rowIndex = e.getRowIndex(); //获取行
		String key = kdtEntrys.getColumnKey(e.getColIndex()); //获取当前修改的列
		IRow row = kdtEntrys.getRow(rowIndex);
		//如果改变的列是金额列 或者税率列
		if(key.equals("amount")||key.equals("taxRate")){
			BigDecimal amount =(BigDecimal) kdtEntrys.getRow(rowIndex).getCell("amount").getValue(); //根据行ID 获取对应的列值
			BigDecimal taxRate =(BigDecimal) kdtEntrys.getRow(rowIndex).getCell("taxRate").getValue(); //根据行ID 获取对应的列值
			if(taxRate==null || taxRate.compareTo(BigDecimal.ZERO)==0){
				kdtEntrys.getRow(rowIndex).getCell("tax").setValue(BigDecimal.ZERO); //根据行ID 设置对应的列值
			}else{
				BigDecimal tax = amount.divide(taxRate.add(new BigDecimal(100)), 2); //计算税率
				kdtEntrys.getRow(rowIndex).getCell("tax").setValue(tax); //根据行ID 设置对应的列值
			}
//			
		}
	}
	/**
	 * 部门添加打开前事件
	 */
    protected void prmtdept_willShow(SelectorEvent e) throws Exception {
    	//在此处可以可以写一些动态的过滤 例如只能选中公司下面的部门
//      EntityViewInfo view = new EntityViewInfo();  //创建view 用来过滤
//      FilterInfo expenseFilter = new FilterInfo();  //创建filter //用来过滤
//      expenseFilter.getFilterItems().add(new FilterItemInfo("isEnabled",true)); //设置过滤条件 只在展示启用状态的数据
//      view.setFilter(expenseFilter);// 将filter 放进view
//      SorterItemCollection sic = new SorterItemCollection(); //设置排序
//      SorterItemInfo sicItme = new SorterItemInfo("number");//设置按照编码排序
//      sicItme.setSortType(SortType.ASCEND); //设置排序方式
//		sic.add(sicItme);  
//		view.setSorter(sic); //排序赋值给 view
//		prmtcompany.setEntityViewInfo(view);// 给公司字段设置过滤
    	super.prmtdept_willShow(e);
    }



因Edit界面相关逻辑代码较多分上中下三篇进行讲解


欢迎加入QQ群:557537072

图片



本文转载自:黑白

作者:微信公众号

原文链接:https://mp.weixin.qq.com/s/PkKrj8UQYMh02L7iSEW4AA

图标赞 9
9人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!