使用这个类,你可以简便的多的完成诸如上面的任务:
| OneView中: public void jump(){ MyView myView = new MyView(); int id = ViewJump.registerPath(this.xxPanel,this); ViewJump.setNext(id,myView.getPanel()); ViewJump.jump(id); } MyView中退回的部分: protected void goBack(){ int id = ViewJump.registerPath(this.myPanel,this); ViewJump.back(id); } 天哪,这并不神奇,600行代码仅仅用了两行就实现了! 好了,我就说这么多了,一切都掌握在你手中,用你的智慧来优化我们的冗余代码吧,因为这样它看起来相当不错. 附:完整代码:(我把ViewPath类放在同一个文件ViewJump.java里,代码上面已经给出) public class ViewJump{ private static ViewPath[] viewPath = null; //私有构造函数 private ViewJump(){} //寻找该Panel是不是在路径中 /** * 找到了返回在实例数组中的下标 * 没有找到返回-1 * @param pnl * @return */ private static int find(JPanel pnl){ // System.out.println("执行find() in ViewJump"); if(viewPath == null || viewPath.length==0) return -1; for(int i = 0;i ViewPath vp = viewPath[i]; //对该路径检查 if(vp.find(pnl) != -1){ return i; } } return -1; } //建立一个新的路径 /** * * @param myPanel * @param myView */ private static int newPath(JPanel myPanel,BaseView myView){ System.out.println("执行newPath() in ViewJump"); //检验一下看有没有无效的路径,有则清除 if(viewPath == null || viewPath.length==0) { viewPath = new ViewPath[]; return 0; } ViewPath[] vjArr = new ViewPath[viewPath.length]; int count = 0; for(int i = 0;i if(viewPath[i].bsView!=null){ //把不为空的值取出来 vjArr[count++] = viewPath[i]; } } viewPath = new ViewPath[count+1]; System.arraycopy(viewPath,0,vjArr,0,count); //复制到原来的数组变量中 //最后一个位置留给新加入的元素 viewPath[count] = new ViewPath(myPanel,myView); return count; } |
/**
* 必须检查该Panel是不是已经在路径中了,如果在路径中,
* 则返回注册的编号,用此编号扁可以访问到正确的类型了
* 如果不在路径中,则以此为开始新建一个新的路径
* 本来检查路径的时候没有必要检查路径的第一个元素,
* 因为一个元素不可能是开端,但是为了防止用户连续两次registerPath的错误
* 请把第一个元素也给检查一下
| * myView 参数只有当该界面为跳转的起始点时才需要,否则保持原始的View * @param me * @param other * 返回实例数组的下标, */ public static int registerPath(JPanel myPanel,BaseView myView){ System.out.println("执行registerPath() in ViewJump"); int idx = find(myPanel); System.out.println("idx="+idx); if(idx==-1){ //返回-1表示没有找到,建立一个新的路径 System.out.println("新建一个路径"); idx = newPath(myPanel,myView); } System.out.println("执行完注册路径.."); return idx; //返回实例下标 } //设定要跳转的下一个目标 public static void setNext(int id,JPanel aim){ if(id<0||id>=viewPath.length){ return; } ViewPath vp = viewPath[id]; //设定目标,从这里看,这是存在安全漏洞的,如果使用者乱传递id进来的话 JPanel[] path = vp.pnlPath; path[vp.index+1] = aim; } //回到上一个 public static void back(int id){ if(id<0||id>=viewPath.length){ return; } ViewPath vp = viewPath[id]; //回到上一个界面 if(vp.index>0){ //只有当前面有路径时才作 vp.bsView.remove(vp.pnlPath[vp.index]); //移去当前的 vp.index--; //游标往前走一步 vp.bsView.add(vp.pnlPath[vp.index],BorderLayout.CENTER); //增加当前的到界面 vp.bsView.validate(); vp.bsView.repaint(); } } //回到起源处 public static void backHome(int id){ if(id<0||id>=viewPath.length){ return; } ViewPath vp = viewPath[id]; //直接回到第一步,需要清除该路径吗?中途断裂怎么办?办法是检查View是否已为空 //选择不清除,每次在建立新的路径时,检查路径是不是已经无效了 vp.bsView.remove(vp.pnlPath[vp.index]); //移去当前的 vp.index = 0; //游标往前走一步 vp.bsView.add(vp.pnlPath[vp.index],BorderLayout.CENTER); //增加当前的到界面 vp.bsView.validate(); vp.bsView.repaint(); } //跳转到下一处 public static void jump(int id){ if(id<0||id>=viewPath.length){ return; } ViewPath vp = viewPath[id]; if(vp.pnlPath[vp.index+1]==null){ return; //下一步根本没有设置 } vp.bsView.remove(vp.pnlPath[vp.index]); //移去当前的 vp.index++; vp.bsView.add(vp.pnlPath[vp.index],BorderLayout.CENTER); vp.bsView.validate(); vp.bsView.repaint(); } } |


