JAVA基础--在Java中轻松实现界面跳转 - 学院 - CHINAUI.com 优艾网 - 中国人机界面设计门户网站
您的位置:首页 >> 学院 >> 交互技术 >> JAVA基础--在Java中轻松实现界面跳转
JAVA基础--在Java中轻松实现界面跳转
来源:IT专家网 作者:jiziba 发布时间:2008-04-15

使用这个类,你可以简便的多的完成诸如上面的任务:  

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();
  }
  }

相关阅读
推荐文章
热点文章