Java中轻松实现界面跳转

2016-01-29 12:57 240 1 收藏

Java中轻松实现界面跳转,Java中轻松实现界面跳转

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

来源:https://www.tulaoshi.com/n/20160129/1488257.html

延伸阅读
Java界面设计应该是一项布满创造性、富有乐趣的工作,但是却往往被认为非常的枯燥和繁琐。究其原因,是因为界面布局领域所采用的描述概念和具体的实现语言之间存在很大的语义隔阂。而一般的界面开发工具提供的所见即所得以及界面布局治理器等方案也无法很好地解决这个问题。 在本文中,我们会给出一种更好的解决方案,我们不是去试图把...
界面设计应该是一项布满创造性、富有乐趣的工作,但是却往往被认为非常的枯燥和繁琐。究其原因,是因为界面布局领域所采用的描述概念和具体的实现语言之间存在很大的语义隔阂。而一般的界面开发工具提供的所见即所得以及界面布局治理器等方案也无法很好地解决这个问题。 在本文中,我们会给出一种更好的解决方案,我们不是去试图把界...
标签: Web开发
碰到一个用javascript实现随机跳转页面实例,发布出来,共同研究下,或许有用哦。 请看下面的实例 html head titlePlease waiting.../title script language="javascript" !-- function urlList(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) {     this[0]=a;     this[1]=b;     thi...
看了本文的截图, 是不是有似曾相识的感觉? 花哨界面不是Windows Vista 和 MacOS的专利,KDE/gnome也可以玩超酷、超炫的界面主题。 gnome的默认色调较为灰暗,这对于刚接触Linux的朋友可能不是那么容易接受。 其实, Linux 本身就非常灵活。在很大程度上您可以定制桌面的外观和行为。没有接触过Linux的朋友可能有这样的观念:Windows下的软...
       一、Java中的远程方法调用 远程方法调用(Remote Method Invocation, RMI)是Java1.1引入的分布式对象软件包,它的出现简化了在多台机器上的Java应用之间的通信。相比CORBA,RMI功能较弱且只能用于Java系统。 二、实现一个简单的RMI 要使用RMI,必须构造四个主要的类:远...

经验教程

858

收藏

41
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部