在Java中輕松實現(xiàn)界面跳轉(zhuǎn)

字號:

假設(shè)這樣一種情況,我們的系統(tǒng)的界面使用Javax.Swing包構(gòu)建,界面的基礎(chǔ)是BaseView,他是一個容器,當(dāng)然他應(yīng)當(dāng)提供獲取控件元素的功能,比如得到按鈕,下拉框,表格等,當(dāng)然僅僅是一個容器而已,而我們的界面的元素全部部署在JPanel上。
    描述為:
    一個界面就是一個BaseView,他只包含一個JPanel,這個包含JPanel包含所有我們的Swing控件,例如JButton,JLable等等。
    問題出現(xiàn)了:我們通常因為業(yè)務(wù)的需要完成一個界面的操作要自動跳轉(zhuǎn)到下一個界面,完成下一個界面又能跳回來(題外話:由于我們的操作是基于GUI的,所以往往能保存Session信息,而Web卻做不到),而這往往成為系統(tǒng)實現(xiàn)過程中效率低下的一個因素,我就見到我現(xiàn)在的系統(tǒng)中有人用600行代碼判斷上一個界面應(yīng)該是哪一個來跳轉(zhuǎn)過來,因為很多界面都可以跳到當(dāng)前界面。
    當(dāng)然有一種做法是,在下一個界面類中包含指向上一個界面的變量,我們說,這不方便,也增加了依賴性,這對軟件是不利的。
    接下來,我給出我的解決方法,希望對采用這種界面結(jié)構(gòu)的朋友有所裨益。
    (以下全部用簡化模型來講述.)
    1.簡單點,我們假設(shè)BaseView繼承JWindow,當(dāng)然可以是別的容器(依據(jù)你的實現(xiàn)),大概象這樣:
    public abstract class BaseView extends JWindow{
    ...
    (實現(xiàn)一些取得界面控件,和界面信息的方法).
    }
    2.每個界面類都象這樣定義:
    public class MyView extends BaseView{
    JPanel myPanel;
    public void playoutPanel(){
    JButton myButton = new JButton("OK");
    myPanel.add(myButton);
    ......
    (添加你需要的控件和布局到myPanel上)
    }
    }
    3.假設(shè)有其他的界面OneView,TwoView,ThreeView處理完操作后都需要跳轉(zhuǎn)到myView,在myView中的ok按鈕按下的時候需要回到原始界面。
    原來臃腫的代碼需要在myView中添加一個變量BaseView anyView;用來存放轉(zhuǎn)來的那個界面anyView,賦值在三者中的跳轉(zhuǎn)代碼中引用myView來設(shè)定.跳轉(zhuǎn)代碼象這樣:
    public void jump(){
    MyView myView = new MyView();
    myView.anyView = this;
    this.remove(this.xxPanel);
    this.add(myView.getPanel());
    this.repaint();
    }
    看起來還不錯,雖然需要引用MyView類,并調(diào)用他的變量和方法.但是跳轉(zhuǎn)回來卻不那么容易,否則怎么會用600行!
    大概象這樣:(這已經(jīng)是被我簡化的)
    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){
    ....
    }
    ...
    }
    不經(jīng)大量應(yīng)用別的業(yè)務(wù)用例界面,這種編譯依賴性真不是什么好事,更何況用了大量的低效的instanceof判斷和轉(zhuǎn)型操作.