亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

小技巧:在Java中輕松實現界面跳轉

2019-11-18 13:09:17
字體:
來源:轉載
供稿:網友

  假設這樣一種情況,我們的系統的界面使用javax.swing包構建,界面的基礎是BaseView,他是一個容器,當然他應當提供獲取控件元素的功能,比如得到按鈕,下拉框,表格等,當然僅僅是一個容器而已,而我們的界面的元素全部部署在JPanel上。
  
  描述為:
  
  一個界面就是一個BaseView,他只包含一個JPanel,這個包含JPanel包含所有我們的Swing控件,例如JButton,JLable等等。
  
  問題出現了:我們通常因為業務的需要完成一個界面的操作要自動跳轉到下一個界面,完成下一個界面又能跳回來(題外話:由于我們的操作是基于GUI的,所以往往能保存session信息,而Web卻做不到),而這往往成為系統實現過程中效率低下的一個因素,我就見到我現在的系統中有人用600行代碼判定上一個界面應該是哪一個來跳轉過來,因為很多界面都可以跳到當前界面。
  
  當然有一種做法是,在下一個界面類中包含指向上一個界面的變量,我們說,這不方便,也增加了依靠性,這對軟件是不利的。
  
  接下來,我給出我的解決方法,希望對采用這種界面結構的朋友有所裨益。
  
  (以下全部用簡化模型來講述.)
  
  1.簡單點,我們假設BaseView繼續JWindow,當然可以是別的容器(依據你的實現),大概象這樣:
  
  public abstract class BaseView extends JWindow{
  ...
  (實現一些取得界面控件,和界面信息的方法).
  }
  
  2.每個界面類都象這樣定義:
  
  public class MyView extends BaseView{
  JPanel myPanel;
  public void playoutPanel(){
  JButton myButton = new JButton("OK");
  myPanel.add(myButton);
  ......
  (添加你需要的控件和布局到myPanel上)
  }
  }
  
  3.假設有其他的界面OneView,TwoView,ThreeView處理完操作后都需要跳轉到myView,在myView中的ok按鈕按下的時候需要回到原始界面。
  
  原來臃腫的代碼需要在myView中添加一個變量BaseView anyView;用來存放轉來的那個界面anyView,賦值在三者中的跳轉代碼中引用myView來設定.跳轉代碼象這樣:
  
  public void jump(){
  MyView myView = new MyView();
  myView.anyView = this;
  this.remove(this.xXPanel);
  this.add(myView.getPanel());
  this.repaint();
  }
  
  看起來還不錯,雖然需要引用MyView類,并調用他的變量和方法.但是跳轉回來卻不那么輕易,否則怎么會用600行!
  
  大概象這樣:(這已經是被我簡化的)
  
  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){
  ....
  }
  ...
  }
  
  不經大量應用別的業務用例界面,這種編譯依靠性真不是什么好事,更何況用了大量的低效的instanceof判定和轉型操作.
  
  為了優化這種情形,徹底解決這個問題,我想應該設計一個第三方類來消除這種依靠性,并且讓界面跳轉不要這么費勁。這個第三方的類是這樣設計的:
  
  在這個類中,必須有一個變量來保存某一個界面跳轉的路徑,如A->B->C.路徑一旦被保存,你就擁有了控制顯示任何一個界面的權利了。在這個鏈中,第一個位置的界面應該是這次跳轉的第一站,最后一個位置是當前站。這里存在一個因果關系:只有跳轉了才可以跳回去。這樣使得我們可以用數組來保存這個路徑?,F實中,跳轉的情形應該不會超過10次,所以我們把路徑長度設為10(當然你可以根據需要更改)。這個類的樣子大概象這樣:
  
  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<pnlPath.length;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; //設立起始站索引
  }
  }
  
  這樣一個類就完成了保存一次跳轉路徑的作用.(當然,是否應該在find方法中設立目標位置是否合適有待商榷)
  
  那么我們如何使用這樣一個路徑?
  
  我們設立一個輔助類來完成這個工作,我們命名為ViewJump,我們知道作為輔助的類最好是不要有實例,非凡是象這樣的起接口作用的類,只提供靜態方法.它的框架象這樣:
  
  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);
  }
  
  完成這樣一個類的代碼量并不多,一百多行,但是卻使得用戶完全脫離了處理不同界面的煩惱.稍后會把該類的源碼附上,值得一提的是,這個類的實現固然可以用到類似的實現當中,但是假如用戶的界面結構并不是如此搭建,你就需要更改參數類型了.假如能把這些抽象出來,得到一個抽象類或接口,參數用Object類型.用戶根據自己的需要去實現這些方法,豈不妙哉!
  
  使用這個類,你可以簡便的多的完成諸如上面的任務:
  
  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.length;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<viewPath.length;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是不是已經在路徑中了,假如在路徑中,
  * 則返回注冊的編

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
不卡在线观看电视剧完整版| 国产97在线|亚洲| 国产有码一区二区| 国产精品视频大全| 国产不卡一区二区在线播放| 精品国产一区二区在线| 亚洲欧美日本另类| 国产午夜精品全部视频在线播放| 红桃av永久久久| 欧美大尺度激情区在线播放| 欧美性猛交xxxx免费看久久久| 在线观看亚洲视频| 欧美精品videosex性欧美| 91九色蝌蚪国产| 国产一区二区动漫| 91在线观看免费高清| 欧美激情区在线播放| 国产免费一区视频观看免费| 欧美成aaa人片在线观看蜜臀| 91精品在线播放| 亚洲美女久久久| 亚洲成色777777女色窝| 亚洲影院污污.| 国产极品jizzhd欧美| 国产亚洲欧洲高清一区| 亚洲精品电影在线观看| 欧美激情免费观看| 一本色道久久综合狠狠躁篇的优点| 国产精品久久久久久久9999| 亚洲精品suv精品一区二区| 在线视频亚洲欧美| 欧美国产日韩一区| 国产精品久久一区主播| 性欧美在线看片a免费观看| 视频在线一区二区| 欧美国产日韩中文字幕在线| 亚洲国产成人久久综合| 最新国产精品亚洲| 日韩av资源在线播放| 欧美一性一乱一交一视频| 91chinesevideo永久地址| 狠狠躁夜夜躁久久躁别揉| 97在线免费视频| 九色成人免费视频| 亚洲自拍欧美另类| 欧美日韩激情小视频| 国产精品成人国产乱一区| 欧美多人爱爱视频网站| 成人a免费视频| 性色av一区二区三区在线观看| 日韩av影院在线观看| 深夜精品寂寞黄网站在线观看| 久久精品99久久香蕉国产色戒| 亚洲新中文字幕| 国产成人精品视频在线| 欧美亚洲第一区| 成人网页在线免费观看| 久久色在线播放| 亚洲电影成人av99爱色| 欧美日韩国产一区二区| 欧美老少做受xxxx高潮| 国产一区二区三区视频在线观看| 亚洲精品720p| 日韩a**站在线观看| 久久精品国产亚洲一区二区| 色中色综合影院手机版在线观看| 国产亚洲一级高清| 国产免费一区二区三区香蕉精| 色综合色综合久久综合频道88| 日韩av免费在线| 欧美一级大片在线观看| 欧美日本国产在线| 热99精品里视频精品| 2020国产精品视频| 中文字幕精品在线| 欧美日韩激情视频| 亚洲精品网站在线播放gif| 2019中文字幕在线| 欧美孕妇孕交黑巨大网站| 久久艳片www.17c.com| 午夜精品www| 97在线视频免费播放| 深夜成人在线观看| 亚洲a中文字幕| 欧美成年人视频| 91久久久久久久久| 亚洲精品网址在线观看| 国产精品一区二区3区| 97香蕉久久夜色精品国产| 国内精品久久影院| 欧美中文字幕在线观看| 精品亚洲国产成av人片传媒| 日韩在线播放一区| 国产综合在线视频| 亚洲天堂av网| 欧洲成人午夜免费大片| 久久久999精品视频| 亚洲天堂av在线免费| www.亚洲男人天堂| 久久精品国产亚洲一区二区| 亚洲第一精品电影| 青青草99啪国产免费| 久久久久久av| 欧美亚洲另类视频| 久久精品99国产精品酒店日本| 日本91av在线播放| 色小说视频一区| 久久久久久久久久久免费精品| www.日韩不卡电影av| 欧美极品在线视频| 国产福利精品在线| 成人免费看黄网站| 亚洲一区二区三区视频播放| 精品无人区太爽高潮在线播放| 亚洲成人1234| 国产区亚洲区欧美区| 一本色道久久综合狠狠躁篇的优点| 亚洲国产一区二区三区在线观看| zzijzzij亚洲日本成熟少妇| 久久久久久美女| 国产精彩精品视频| 亚洲激情视频在线观看| 欧美日韩一区二区免费在线观看| 日韩精品视频免费专区在线播放| 日韩高清不卡av| 亚洲国产精品va在线观看黑人| 91精品国产色综合| 日韩精品在线电影| 国产福利精品视频| 欧美大尺度激情区在线播放| 国产美女扒开尿口久久久| 国产91精品黑色丝袜高跟鞋| 欧美在线视频在线播放完整版免费观看| 国产精品一区二区久久国产| 91精品久久久久久| 欧美丝袜美女中出在线| 一本色道久久综合亚洲精品小说| 7777精品视频| 97av在线视频| 中文字幕亚洲欧美日韩高清| 精品国产依人香蕉在线精品| 成人免费xxxxx在线观看| 亚洲精品一区二区网址| 91中文精品字幕在线视频| 久久精品免费播放| 久久久久久久久久婷婷| 欧美精品一区在线播放| 欧美高跟鞋交xxxxhd| 亚洲欧美制服综合另类| 亚洲欧洲一区二区三区在线观看| 亚洲视频日韩精品| www.欧美视频| 国产视频精品久久久| 中文字幕不卡av| 欧美亚洲另类制服自拍| 日本久久久a级免费| 亚洲天堂久久av| 亚洲xxx大片| 亚洲人成网7777777国产| 日韩激情第一页| 丁香五六月婷婷久久激情| 亚洲精品成人久久| 国产日韩中文字幕| 国产精品午夜一区二区欲梦|