public abstract class BaseView extends JWindow{ ... (实现一些取得界面控件,和界面信息的方法). } |
public class MyView extends BaseView{ JPanel myPanel; public void playoutPanel(){ JButton myButton = new JButton("OK"); myPanel.add(myButton); ...... (添加你需要的控件和布局到myPanel上) } } |
public void jump(){ MyView myView = new MyView(); myView.anyView = this; this.remove(this.xxPanel); this.add(myView.getPanel()); this.repaint(); } |
public void goBack(){ if(anyView instanceof OneView){ anyView.remove(this.myView); OneView ov = (OneView)anyView; anyView.add(ov.getPanel()); anyView.repaint(); } if(anyView instanceof TwoView){ .... } ... } |
class ViewPath{ JPanel[] pnlPath = null; //跳转的界面路径,界面跳转最大10个层次吧!!! int index = 0; //路径中的当前下标 BaseView bsView = null; //当前路径所在的同一个View //在路径中寻找目标的方法 public int find(JPanel pnl){ //该路径下是否有某个Panel,有的话返回下标,没有的话返回-1 if(bsView==null) return -1; //没有初始化,该路径下没有任何Panel for(int i=0;i if(pnl==pnlPath[i]){ index = i; return i; //如果找到了则返回位置,并且把当前位置设为目标位置 } } return -1; //没有找到,返回-1 } //构造函数 ViewPath(JPanel myPanel,BaseView myView){ pnlPath = new JPanel[10]; //设置路径最大长度为10 bsView = myView; //设置该路径所属的那个View pnlPath[0] = myPanel; //设立起始站 index = 0; //设立起始站索引 } } |
public class ViewJump{ private static ViewPath[] viewPath = null; //路径池,系统多处使用,静态但私有,因为供内部用 private ViewJump(){} //私有构造方法,辅助类只提供静态方法 private static int find(JPanel pnl); //寻找给定的Panel是否在已有路径中,私有 private static int newPath(JPanel myPanel,BaseView myView); //建立一个新路径,私有 /** * 每个类需要使用该辅助类时都需要第一步注册自己,然后才能做其他操作 * 返回一个注册码id,辅助类需要使用这个注册码进行其他操作 */ public static int registerPath(JPanel myPanel,BaseView myView); /** * 设立下一个界面. */ public static void setNext(int id,JPanel aim); /** * 回到上一个界面 */ public static void back(int id); /** * 回到第一个界面 */ public static void backHome(int id); /** * 跳转到下一个界面 */ public static void jump(int id); } |
public void jump(){ MyView myView = new MyView(); int id = ViewJump.registerPath(this.xxPanel,this); ViewJump.setNext(id,myView.getPanel()); ViewJump.jump(id); } |
protected void goBack(){ int id = ViewJump.registerPath(this.myPanel,this); ViewJump.back(id); } |
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[]{new ViewPath(myPanel,myView)}; 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(); } } |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131004/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/374079/viewspace-131004/