Java中輕鬆實現界面跳轉java
做者:兄弟連 www.itxdl.cn數組
Java中輕鬆實現界面跳轉,Java中輕鬆實現界面跳轉函數
假設這樣一種狀況,咱們的系統的界面使用javax.swing包構建,界面的基礎是BaseView,他是一個容器,固然他應當提供獲取控件元素的功能,好比獲得按鈕,下拉框,表格等,固然僅僅是一個容器而已,而咱們的界面的元素所有部署在JPanel上。佈局
描述爲:優化
一個界面就是一個BaseView,他只包含一個JPanel,這個包含JPanel包含全部咱們的Swing控件,例如JButton,JLable等等。this
問題出現了:咱們一般由於業務的須要完成一個界面的操做要自動跳轉到下一個界面,完成下一個界面又能跳回來(題外話:因爲咱們的操做是基於GUI的,因此每每能保存Session信息,而Web卻作不到),而這每每成爲系統實現過程當中效率低下的一個因素,我就見到我如今的系統中有人用600行代碼判斷上一個界面應該是哪個來跳轉過來,由於不少界面均可以跳到當前界面。設計
固然有一種作法是,在下一個界面類中包含指向上一個界面的變量,咱們說,這不方便,也增長了依賴性,這對軟件是不利的。繼承
接下來,我給出個人解決方法,但願對採用這種界面結構的朋友有所裨益。索引
(如下所有用簡化模型來說述.)rem
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; //設立起始站索引
}
}