標籤:依賴性 軟體 java 資訊 元素
Java中輕鬆實現介面跳轉
兄弟連Java中輕鬆實現介面跳轉,Java中輕鬆實現介面跳轉
假設這樣一種情況,我們的系統的介面使用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.路徑一旦被儲存,你就擁有了控制顯示任何一個介面的權利了。在這個鏈中,第一個位置的介面應該是這次跳轉的第一站,最後一個位置是當前站。這裡存在一個因果關係:只有跳轉了才可以跳回去。這樣使得我們可以用數組來儲存這個路徑。現實中,跳轉的情形應該不會超過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 if(pnl==pnlPath[i]){
index = i;
return i; //如果找到了則返回位置,並且把當前位置設為目標位置
}
}
return -1; //沒有找到,返回-1
}
//建構函式
ViewPath(JPanel myPanel,BaseView myView){
pnlPath = new JPanel; //設定路徑最大長度為10
bsView = myView; //設定該路徑所屬的那個View
pnlPath[0] = myPanel; //設立起始站
index = 0; //設立起始站索引
}
}
Java中輕鬆實現介面跳轉