问题

(用户实际作业中,在多字段业务单据是一个惨痛的记忆)

数据正常填写:进入单据体界面,必填项都存在,设定没有异常填写情况。点击新增按钮,提示信息修改框中选择【是】,数据能正常保存,此时清空单据体数据,返回新的单据体界面。

数据异常填写:进入单据体界面,必填项都存在,设定存在异常填写情况。点击新增按钮,提示信息异常框中选择【确定】,数据不能保存,此时单据体数据被清空,返回新的单据体界面。

期望:

当数据填写有异常,用户进行新增或者其他操作时出现提示信息异常框,选择【确定】返回原单据体界面,也就是不清除单据体的数据,供用户在原数据基础上继续修改填写信息。

解决方案

从上面可以看出,当没有异常,也就是保存检查通过时,数据可以保存且返回新的单据体界面;有异常时,也返回了新的单据体界面。那么可以看出就是,当代码在检查数据通过时是不走有异常的处理方法,正常对数据进行保存;当有异常会终止保存操作,进入编写的异常处理方法。所以我们需要对异常处理的方法进行分析整改。

提示返回,return; 和 abort 的区别:

// 检查信息

if (!checkData()) {

      // return;

     this.abort();

 }

return;

invoke:在具有指定参数的指定对象上调用此Method对象表示的基础方法。单个参数将自动展开以匹配原始形式参数,并且必要时对原始参数和引用参数都进行方法调用转换。也就是说以异常抛出的方式进行stack unwinding,调用局部对象析构函数,清理局部对象原有数据,并且关闭窗口。所以打开的是新的窗体,相当于在序时簿界面点击新增按钮。

void setDelegate(MethodAccessorImpl paramMethodAccessorImpl)

{ this.delegate = paramMethodAccessorImpl; }


public Object invoke(Object paramObject,Object[] paramArrayOfObject)

{ return this.delegate.invoke(paramObject, paramArrayOfObject); }

abort();

设置父级窗口的默认值,返回第一个父级活动窗口。所以终止保存操作后,返回原单据体界面,且保存原有数据不清除。换句话说调用abort时,不会调用任何对象的析构函数,不进行任何清理工作,直接终止程序。

protected void abort()

{ setCursorOfDefault(); SysUtil.abort(); } // 设置父级窗口为默认


public void setCursorOfDefault()

{ setCursorOfDefault(null); }


public void setCursorOfDefault(ActionEvent e) {

        if (window == null) { // 返回第一个父级活动窗口

              window = SwingUtilities.getWindowAncestor(this);

              Component component = getInvokerComponent(e);

              if (e != null && component != null)

                      window = ComponentUtil.getOwnerWindow(component);

              if (window == null) // 如果活动窗口与调用线程在同一上下文中,则返回活动窗口。

                      window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();

              if (window == null) return;

        } // 返回系统默认活动窗口

        window.setCursor(Cursor.getDefaultCursor());

        window = null;

}


(注:这里两种的用法都有各自的优缺点,没有好坏之意,结合具体的业务需求使用。)

相关的文章



Write a comment…