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; //设立起始站索引
}
}