假設這樣一種情況
描述為:
一個界面就是一個BaseView
問題出現了:我們通常因為業務的需要完成一個界面的操作要自動跳轉到下一個界面
當然有一種做法是
接下來
(以下全部用簡化模型來講述
public abstract class BaseView extends JWindow{
(實現一些取得界面控件
}
public class MyView extends BaseView{
JPanel myPanel;
public void playoutPanel(){
JButton myButton = new JButton(
myPanel
(添加你需要的控件和布局到myPanel上)
}
}
原來臃腫的代碼需要在myView中添加一個變量BaseView anyView;用來存放轉來的那個界面anyView
public void jump(){
MyView myView = new MyView();
myView
this
this
this
}
看起來還不錯
大概象這樣:(這已經是被我簡化的)
public void goBack(){
if(anyView instanceof OneView){
anyView
OneView ov = (OneView)anyView;
anyView
anyView
}
if(anyView instanceof TwoView){
}
}
不經大量應用別的業務用例界面
為了優化這種情形
在這個類中
class ViewPath{
JPanel[] pnlPath = null; //跳轉的界面路徑
int index =
BaseView bsView = null; //當前路徑所在的同一個View
//在路徑中尋找目標的方法
public int find(JPanel pnl){ //該路徑下是否有某個Panel
if(bsView==null) return
for(int i=
index = i;
return i; //如果找到了則返回位置
}
}
return
}
//構造函數
ViewPath(JPanel myPanel
pnlPath = new JPanel; //設置路徑最大長度為
bsView = myView; //設置該路徑所屬的那個View
pnlPath[
index =
}
}
這樣一個類就完成了保存一次跳轉路徑的作用
那麼我們如何使用這樣一個路徑?
我們設立一個輔助類來完成這個工作
public class ViewJump{
private static ViewPath[] viewPath = null; //路徑池
private ViewJump(){} //私有構造方法
private static int find(JPanel pnl); //尋找給定的Panel是否在已有路徑中
private static int newPath(JPanel myPanel
/**
* 每個類需要使用該輔助類時都需要第一步注冊自己
* 返回一個注冊碼id
*/
public static int registerPath(JPanel myPanel
/**
* 設立下一個界面
*/
public static void setNext(int id
/**
* 回到上一個界面
*/
public static void back(int id);
/**
* 回到第一個界面
*/
public static void backHome(int id);
/**
* 跳轉到下一個界面
*/
public static void jump(int id);
}
完成這樣一個類的代碼量並不多
使用這個類
OneView中:
public void jump(){
MyView myView = new MyView();
int id = ViewJump
ViewJump
ViewJump
}
MyView中退回的部分:
protected void goBack(){
int id = ViewJump
ViewJump
}
天哪
好了
附:完整代碼:(我把ViewPath類放在同一個文件ViewJump
public class ViewJump{
private static ViewPath[] viewPath = null;
//私有構造函數
private ViewJump(){}
//尋找該Panel是不是在路徑中
/**
* 找到了返回在實例數組中的下標
* 沒有找到返回
* @param pnl
* @return
*/
private static int find(JPanel pnl){
// System
if(viewPath == null || viewPath
for(int i =
if(vp
return i;
}
}
return
}
//建立一個新的路徑
/**
*
* @param myPanel
* @param myView
*/
private static int newPath(JPanel myPanel
System
//檢驗一下看有沒有無效的路徑
if(viewPath == null || viewPath
viewPath = new ViewPath[]{new ViewPath(myPanel
return
}
ViewPath[] vjArr = new ViewPath[viewPath
int count =
for(int i =
vjArr[count++] = viewPath[i];
}
}
viewPath = new ViewPath[count+
System
//最後一個位置留給新加入的元素
viewPath[count] = new ViewPath(myPanel
return count;
}
//獲得實例的方法
/**
* 必須檢查該Panel是不是已經在路徑中了
* 則返回注冊的編號
* 如果不在路徑中
* 本來檢查路徑的時候沒有必要檢查路徑的第一個元素
* 因為一個元素不可能是開端
* 請把第一個元素也給檢查一下
* myView 參數只有當該界面為跳轉的起始點時才需要
* @param me
* @param other
* 返回實例數組的下標
*/
public static int registerPath(JPanel myPanel
System
int idx = find(myPanel);
System
if(idx==
System
idx = newPath(myPanel
}
System
return idx; //返回實例下標
}
//設定要跳轉的下一個目標
public static void setNext(int id
if(id<
return;
}
ViewPath vp = viewPath[id];
//設定目標
JPanel[] path = vp
path[vp
}
//回到上一個
public static void back(int id){
if(id<
return;
}
ViewPath vp = viewPath[id];
//回到上一個界面
if(vp
vp
vp
vp
vp
vp
}
}
//回到起源處
public static void backHome(int id){
if(id<
return;
}
ViewPath vp = viewPath[id];
//直接回到第一步
//選擇不清除
vp
vp
vp
vp
vp
}
//跳轉到下一處
public static void jump(int id){
if(id<
return;
}
ViewPath vp = viewPath[id];
if(vp
return; //下一步根本沒有設置
}
vp
vp
vp
vp
vp
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26870.html