问题
(用户实际作业中,在多字段业务单据是一个惨痛的记忆)
数据正常填写:进入单据体界面,必填项都存在,设定没有异常填写情况。点击新增按钮,提示信息修改框中选择【是】,数据能正常保存,此时清空单据体数据,返回新的单据体界面。
数据异常填写:进入单据体界面,必填项都存在,设定存在异常填写情况。点击新增按钮,提示信息异常框中选择【确定】,数据不能保存,此时单据体数据被清空,返回新的单据体界面。
期望:
当数据填写有异常,用户进行新增或者其他操作时出现提示信息异常框,选择【确定】返回原单据体界面,也就是不清除单据体的数据,供用户在原数据基础上继续修改填写信息。
解决方案
从上面可以看出,当没有异常,也就是保存检查通过时,数据可以保存且返回新的单据体界面;有异常时,也返回了新的单据体界面。那么可以看出就是,当代码在检查数据通过时是不走有异常的处理方法,正常对数据进行保存;当有异常会终止保存操作,进入编写的异常处理方法。所以我们需要对异常处理的方法进行分析整改。
提示返回,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;
}
(注:这里两种的用法都有各自的优缺点,没有好坏之意,结合具体的业务需求使用。)
0 Comments