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

}

}

时间: 2024-10-29 19:09:40

Java中轻松实现界面跳转的相关文章

Java中的图形界面编程

前言 正文 Java中的图形界面编程 AWT/Swing AWT(Abstract Window ToolKits,抽象窗口工具集) 1.容器类:用来存储组件,实现容器布局 2.组件类:实现界面的一些特定功能 一个容器可以包涵多个组件,组件必须存放在容器中 3.布局管理器:实现容器的布局设置 4.图形类:包括一些基本图形 Swing是AWT的一个轻量级框架 java.lang.Object java.awt.Component java.awt.Container java.awt.Window

Spring boot中controller控制界面跳转

项目结构: 控制类:IndexController package com.example.meeting.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller//@RequestMapping(value = {"/xxx"}) public class IndexC

Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他

现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: [java] view plaincopy Intent intent =new Intent(); intent.setAction("android.intent.action.CALL_BUTTON"); startActivity(intent); 和 [java] view plaincopy Uri uri = Uri.parse("te

java中break、continue及标签等跳转语句的使用[上]

java 中跳转语句使用break.continue和标签,各自或组合完成相应的功能. 今天做题时遇到关于标签命名规范,顺便将跳转语句语法都看了一遍,很有收获. 在<Java编程思想>一书中,作者详细阐述,现将案例代码写在下面: public class LabeledFor { public static void main(String[] args) { int i=0; outer: for(;true;){ inner: for(;i<10;i++){ System.out.p

Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下.1.跳转到拨号界面,代码如下: 1)直接拨打 Intent intentPhone = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); startActivity(intentPhone); 2)跳转到拨号界面 Intent intent = newIntent(Intent.ACTION_DIAL,Uri.pars

JAVA中循环删除list中元素的方法总结(跳格删除问题解决)(转)

印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末.看总结.. JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环).iterator遍历. 1.for循环遍历list for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")

轻松搞懂Java中的自旋锁

前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙去脉,那么这篇文章就先来会一会"自旋锁". 正文 出现原因 在我们的程序中,如果存在着大量的互斥同步代码,当出现高并发的时候,系统内核态就需要不断的去挂起线程和恢复线程,频繁的此类操作会对我们系统的并发性能有一定影响.同时聪明的JVM开发团队也发现,

23种设计模式介绍以及在Java中的实现

原创不易,转载请注明出处:http://anxpp.com/,谢谢!     文章比较长,读者可以通过顶端的目录选择要了解的模式,然后通过文章右边的按钮快速返回顶部重新选择一个新的模式浏览 博主精心准备了大量的示例代码.文章尽量提供与编程相关的例子,而不是像多数其他介绍的文章一样,提供一些感觉挺滑稽的例子(那样的例子可能看完觉得写得很好,然而还是不会用...). 本文耗费了作者大量时间,还请亲们给个赞O(∩_∩)O~ 也可以通过CTRL+F并输入要了解的模式并跳到对应位置. 文章中的示例源码在g

java中paint repaint update 之间的关系

最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲.但是他们之间是怎么来调用的呢,咱们来分析一下(想直接看结果,请跳过分析过程): -----------------------------------------------------------------------------------------------------------------------------