文档视界 最新最全的文档下载
当前位置:文档视界 › 基于MVC模型的swing图形组件的设计

基于MVC模型的swing图形组件的设计

基于MVC模型的swing图形组件的设计
基于MVC模型的swing图形组件的设计

作者简介:郑三红(1971—) 男,湖南新田人,硕士研究生。研究方向为业务流程管理,设计模式,J2EE , 基于MVC 模型的swing 图形组件的设计

郑三红, 李长云

(湖南大学软件学院 长沙410082)

摘要:介绍了java 基础类库 swing 包中图形组件的组成和设计的原则,从模型、视图、控制这三部分与树的对应部分来说明图形包的设计和实现,使swing 中对图这种数据结构也能可视化表示,对完善swing 的体系结构有着重要的意义。

关键词: java 图形 MVC 模型 设计模式

中图分类号:TP317.1

Design the JGraph Swing Component Base on MVC Pattern

ZHENG San-hong,LI Chang-yui

(Software School in Hunan University,Changsha 410082)

Abstract

This paper provides a description of the JGraph component and the design principle. From model 、view 、control we outlines the main differences and consequences on the API between JGraph and JTree ,that make the data structure of graph be visible, and have a meaningful for the integrity of the swing package

Key word Graph MVC JTree design-pattern

1. 引言

java swing 包中对集合、线性结构、树结构,表等数据结构都有相应的包如Collection 、JList 、JTree 、JLable 来表示,但遗憾的是对图或网这种数据结构(注这里的图指的是基于图论的概念,既任何有联系的对象的网络结构,而不是功能性画图)却没有一种包来体现。而图在现实生活中有着重要的应用。因此,开发一个个基于图论的java 图形包就显得十分必要。对于完善swing 包体系有着重要的意义。

2. MVC 模式介绍

面向对象软件最大的好处之一就是复用,不是解决任何问题都要从头做起。在众多的软件开发过程中,人们发现了许多问题都可以运用以前的设计方案解决现在的问题。设计模式也就应运而生,简单地说,设计模式是对反复出现的设计问题的重复解决方案。在众多的设计模式中,有一种模型-视图-控制模式,简称MVC 模式。这个模式是一种通用的框架,它由三部分组成,如图1所示:

图1 MVC 模型 图2 swing 模型-代理模式

模型Model 负责维护组件的状态,在视图View 中显示模型所代表的数据,控制器Controller 执行事件处理,改变和查看数据。采用MVC 模式好处是数据的表示、存储和控制分开,各个部分互相协作,共同完成一个任务

3. 基于MVC 的JAVA SWING 图形包设计

已有的swing 包的组件设计和实现中,完全采用了MVC 模型的一个延伸模式——模型-代理模型。如图2所示:

每个swing组件Component中含有一个模型Model,一个用户接口代理(UI-delegate)组成,其中代理类封装了视图和控制部分。

提供一个完全与Swing中的组件兼容的基于图的数学理论以及swing包中的用户接口库的组件,通过这两者的结合,能可视化的表示图这种数据结构。

Swing作为java的基础库,已经为众多程序员所熟悉。采取与swing的体系结构一致的架构,能达到减少学习成本,充分复用现有的代码,缩短开发时间降低成本的效果。

swing包中所有已实现的这些数据结构中,以树最为复杂,最接近图,而且树可看成是图的一种特例。我们可以仿照树的设计和实现来设计和实现图这种数据结构。

3.1总体框架

在swing包中,用JTree来代表对这种组件。同样,用JGraph来表示图这种组件。树的大体结构如图所示:

图3 JTree的总体框架图4 JGraph的总体框架

其中JTree是组件,TreeModel是模型Model,TreeUI是代理,封装了Control和View。与此类似,也可设计图一些类和结口如上图所示:其中JGraph是组件,GraphModel是模型,GraphUI是代理,封装了Control和View。

了解了图的功能需求后,下面,我将以模型、视图、控制这三部分与树的对应部分来说明图形包的组成和实现。

3.2模型类设计

模型部分主要提供图的数据,在JTree包

中用TreeModel接口类来表示树的模型。同样,

可定义图的模型接口类GraphModel。JTree的

元素为TreeNode,并有一个默认的实现类

DefaultMutableTreeNode,而图的元素包括三个

部分,因此它的元素设计如图5。

图5 图的元素层次关系

顶点、边、端口以及它们的连接信息组成了图的结构(graph structure)。除此之外,还有一种整体与部分结构,称为组结构。比如右图由顶点A、B、C和联接边1、2组成了图的结构,

但如果把AB看成一个组的话,则顶点A包

括顶点a,作为它的孩子,顶点B包括b0,b1

作为它的孩子。

为了表示图结构改变,用ConnectSet

类来表示,用ParentMap来表示父亲和孩子这种组结构。图6 图的组结构JTree中定义了树的选择模型接口TreeSelectionModel和它的默认实现类DefualTreeSelectionModel,同样,在图中定义GraphSelectionModel和它的默认实现类DefualGraphSelectionModel。在TreeModel类中定义了对树模型状态的提取操作和监听树模型事件的方法。由于图的复杂性,类GraphModel必须具备的操作有层次、图结构、组结构,改变模型(插入、删除、修改)以及监听两个事件。

3.3视图类设计

视图部分是数据的表示。在JTree中,

有一个类AbstractLayoutCache用来表示树

的视图,同样,我们用GraphLayoutCache

来代表图的视图。然而树的视图毕竟简单

得多,树的可见性只有展开和收缩两种状

态,并且各个结点的视图基本一致。而图

中元素很多,并且位置、大小由用户随意

调整。所以必须区别不同的元素,产生不

同的结点视图,再由这些单独的视图组成

图的整体视图。因此就有了图7所示的各

种视图类的层次关系。图7 图的视图类层次关系视图是模型的表示,因此必须有一个类来联接模型和视图,这个类我们定义为CellMapper。同时,图中每个类都处于一个上下文中,比如顶点A和B相连,现在通过鼠标移动B,虽然并没有选择它们的边,但显然,它们之间的连接边也必须移动,其中的属性必须要在一个类中得到体现,这个类取名为GraphContext类。并且用来产生临时视图(移动和拷贝时)。

3.4控制类设计

控制定义了用户的输入事件和选择模式在模型和视图之间的映射关系。在JTree包中,有一个TreeUI和它的继承类BasicTreeUI。仿照JTree的实现,这里也定义了一个GraphUI类和一个BasicGraphUI类。对树的编辑和渲染控制定义了两个接口类TreeCellEditor、TreeCellRenderer和它们的默认实现类DefaultTreeCellEditor,DefaultTreeCellRenderer。同样,图中也对应有两个接口类

GraphCellEditor和CellViewRenderer。

定义GraphCellEditor的默认实现类为

DefaultGraphCellEditor。由于有三种

CellView接口,所以对应有三种渲染器

PortRenderer、VertexRenderer和图8 图的渲染器类关系EdgeRenderer类。它们之间的关系如

图8所示。

元素处理器:是一个全新的概念。因为以往的swing对象只支持就地编辑,其位置和大小一旦定下来后就不能再改变。而在图中,元素的位置和大小经常改变,因此,必须有一个方法来实现这些功能。在图中定义了一个接口CellHandle和它的三个实现类SizeHandle、EdgeHandle和RootHandle。其中SizeHandle类用来改变元素的大小,EdegeHandle用来处理联接,RootHandle用来处理元素移动。

在JTree包中,事件有TreeModelEvent、TreeSelectEvent和它们的监听者接口TreeModelListener、TreeeSelectListener。同样,在图中我们也定义了GraphModelEvent、GraphSelectEvent和GraphModelListener、GraphSelectListener。

swing包中有UndoManager,为了使图形包也具有撤销和重做的历史记录功能这种功能,可以继承出一个GraphUndoManager类,覆盖父类的方法和扩充与图相应的方法。

3.5 可扩展点

总的来说,以上的设计由于首先定义好由于了图形包的接口类,规定了这些类的公共的方法,以及从这些接口继承面来的抽象类,定义一个公共的实现方法。最后定义一个默认的实现类。从应用的角度出发,如果默认的实现类可以满足要求,那么就可直接用这个类,否则,从默认的实现类中继承,重载不满足特殊要求的方法。这样,完全满足了可复用的图形包的设计要求。

4.小结和下一步的工作

根据swing中JTree包的设计和实现,基于MVC模式,找出树与图的相同点和区别,可方便地设计实现图这种数据结构。

下一步工作,是设计和实现一些类,用来把图转化成XML语言和SVG格式。方便不同图形工具之间的格式的交换与共享。

参考文献

[1] Gamma, Helm, Johnson, and Vlissides, Design Patterns, Addison-Wesley, 1995.

[2] JTree API Specification,

https://www.docsj.com/doc/d112569979.html,/j2se/1.4/docs/api/javax/swing/JTree.html, Sun Microsystems.

[3] https://www.docsj.com/doc/d112569979.html,

[4] The Swing Tutorial, https://www.docsj.com/doc/d112569979.html,/docs/books/tutorial/index.html, Sun Microsystems.

[5] Geary, Graphic Java 2, Volume III: Advanced Swing (3rd Edition), Sun Microsystems, 1999.

java图形界面之电子算盘

Java图形用户界面 院系: 计算机系姓名:后人好乘凉 一实验目的 ●使学生综合运用图形用户界面设计的概念; ●使学生熟悉使用中间面板,组成层次复杂的GUI界面; ●使学生掌握使用事件驱动编程; 二实验环境及实验准备 ●所需硬件环境为微机; ●所需软件环境为JDK、Eclipse; ●掌握Java下界面容器与基本组件的基本知识与应用; ●掌握Java下事件处理模型; ●掌握Java下图形绘制的方法; 三实验内容 (一)、设计实现电子算盘,并完成测试; [题目描述及要求] 给小朋友设计一个电子算盘。要求绘制电子算盘界面,设计并实现打珠算过程(界面参考如下图示)。 电子算盘参考界面示意 程序源代码: package calculator;

import java、awt、Color; //导入 import java、awt、GridLayout; import java、awt、Container; import javax、swing、JLabel; import javax、swing、JButton; import javax、swing、ImageIcon; import javax、swing、JPanel; import javax、swing、JFrame; import javax、swing、JTextField; import java、awt、event、*; public class Calculator extends JFrame{ public int totalNumber; public int t = 0; public boolean[] isAddFive = new boolean[5]; public int number[] = new int[5]; public ImageIcon picture = new ImageIcon(System、getProperty("user、 dir") + "/算珠、jpg" ); //添加图片 public ImageIcon picture1= new ImageIcon(System、getProperty("user、 dir") + "/算珠1、jpg" ); Container con = getContentPane(); JPanel j1 = new JPanel(); JPanel j2 = new JPanel(); JPanel j3 = new JPanel(); JPanel time=new JPanel(); JLabel q = new JLabel(); JLabel nA = new JLabel(); JLabel Time=new JLabel(new ImageIcon("、/时钟、jpg")); //添加时钟标签的图片 JTextField a = new JTextField(); JButton Buttons_1[][] = new JButton[2][5]; JButton Buttons_2[][] = new JButton[5][5]; GridLayout gl_1 = new GridLayout(2,5); GridLayout gl_2 = new GridLayout(5,5); GridLayout gl_3 =new GridLayout(); public Calculator() { super("电子算盘"); setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE); setBounds(100,100,600,400); setVisible(true); setLayout(null); AbacusPanel(); } public void AbacusPanel() // 算盘面板

java图形化界面练习及答案

作业标题:第四次练习题(总分:得分:分)一、单选题(共有题目15题,共计分) 1. 下列属于容器的组件有 A. JButton B. JPane C. Canvas D. JTextArea 学生的答案: B 标准答案: B 该题分数: 学生得分: 分 2. 下列方法中,不属于WindowListener接口的是A. windowOpened() B.

windowClosed() C. windowActivated() D. windowAdapter 学生的答案: D 标准答案: D 该题分数: 学生得分: 分 3. 下列不属于Swing中组件的是( )。 A. JPanel B. JTable C. Menu D. JFrame 学生的答案: C 标准答案: C 该题分数:

学生得分: 分 4. 以下Swing组件中哪一个不是顶层容器组件( )。 A. 框架 B. 对话框 C. 面板 D. 小程序 学生的答案: C 标准答案: A 该题分数: 学生得分: 0分 5. 对于Swing基本控件单选框,若要使两个单选框对象之间具有相互排斥的关系,需要( )。 A. 创建两个单选框对象时定义相同的对象名 B. 将两个单选框对象放在同一个面板上

定义一个ButtonGroup对象group,将两个单选框对象加到group中D. 让两个单选框排成一行或一列 学生的答案: C 标准答案: C 该题分数: 学生得分: 分 6. 容器被重新设置大小后,( )布局管理器的容器中的组件大小不随容器大小的变化而改变。 A. CardLayout B. FlowLayout C. BorderLayout D. GridLayout 学生的答案: B 标准答案: B 该题分数: 学生得分: 分

java实验报告实验六Java图形用户界面

信息工程学院 Java程序设计实习报告 JAVA图形用户界面 实验六Java图形用户界面 1.实验目的 (1)掌握图形用户界面基本组件。 (2)了解如何使用布局管理器对组件进行管理。 (3)掌握Java事件处理机制。 2.实验内容 实验题 1 编写一个模拟计算器的程序,使用面板与网格布局,添加一个文本框,10个数字按钮(0-9),4个加减乘除按钮,一个等号按钮,一个清除按钮,要求将计算公式与结果显示在文本框中。 运行结果: 实验报告的内容与格式按任课教师的要求书写。

加法: 主要代码: private void initComponents() { jButton1 = new javax、swing、JButton(); jButton2 = new javax、swing、JButton(); jButton3 = new javax、swing、JButton(); jButton4 = new javax、swing、JButton(); jButton5 = new javax、swing、JButton(); jButton6 = new javax、swing、JButton(); jButton7 = new javax、swing、JButton(); jButton8 = new javax、swing、JButton(); jButton9 = new javax、swing、JButton(); jButton10 = new javax、swing、JButton(); jButton11 = new javax、swing、JButton(); jButton12 = new javax、swing、JButton(); jButton13 = new javax、swing、JButton(); jButton14 = new javax、swing、JButton(); jButton15 = new javax、swing、JButton(); jTextField1 = new javax、swing、JTextField(); setStub(null); jButton1、setText("3"); jButton1、addActionListener(new java、awt、event、

java课程设计报告_简单图形界面计算器的设计

Java 课程设计 简单图形界面计算器的设计 课程名称 Java程序设计 选题名称简单图形界面计算器的设计 专业 班级 姓名 学号 指导教师 简单图形界面计算器的设计

一、设计任务与目标 本次java程序设计我的设计任务是设计一个图形界面(GUI)的计算器应用程序并且能够完成简单的算术运算。本次任务的基本要求是这个计算器应用程序可以完成十进制的加、减、乘、除、求倒、取余、开方运算,且有小数点、正负号、退格和清零功能。而我要在此基础上添加一项千位符分隔符的功能,即以三位为一级,在输入的一串数字中每三位加入一个逗号,这项功能国际通用,并已经成为惯例,会计记账都用这种方法便于账目核算与管理。 GUI计算器设计的具体目标: 1.完成十进制的加、减、乘、除、求倒、取余和开方运算; 2.有小数点和正负号加入运算; 3.有退格、复位和清零的功能; 4.有千位符分隔符的功能,即在输入的一串数字中每三位加入一个逗号。 二、方案设计与论证 1.设计目标的总体分析 (1)设计目标的需求分析:计算器是现在一个普遍应用的工具,能够解决许多人工所无法计算的数据,节省大量宝贵的时间。 (2)设计目标的功能分析:实现计算器系统的功能,主要有两个功能模块:输入和输出。 (3)设计原则:基于计算器系统要具有适用性广、操作简便等特点,本系统预计要达到以下几个目标:①满足以上的基本功能要求;②能够在常见的计算机及其操作系统上运行。 2.设计的基本思路 利用GUI的界面设计,将整个大设计分为三块,分别是数据的输入,运算符

功能符的控制和数据的输入输出显示。利用Swing控件,数据的输入由0~9这10个按钮来表示,用“+”、“-”、“*”、“/”、“1/x”、“%”、“sqrt”这7个按钮来表示加、减、乘、除、求倒、取余、开方运算,用“.”和“±”这2个按钮来表示小数点和正负号,用“Back”、“CE”和“C”这3个按钮来表示退格、复位和清零的功能,数据的输入输出显示由文本字段来表示。将计算器的总体界面设计好后,再将代码分别写入不同的按钮的源程序中。 我要完成的一项改进,即添加一个拥有千位符分隔符功能的按钮,按下这个按钮能够在输入的一串数字中每三位加入一个逗号并且显示出来。我要在之前的界面设计的基础上多添加一个按钮“$”来表示千位符分隔符,并且将功能代码写入这个按钮的源程序中。 三、程序流程图,程序清单与调用关系 1. 程序流程图:

Java基础实验报告-图形用户界面设计

南京工程学院 实验报告 课程名称 JAVA基础 实验项目名称图形用户界面设计 实验学生班级 实验学生姓名 学号 同组学生姓名 实验时间 实验地点 实验成绩评定 指导教师签字年月日

一、实验目的和要求 1.掌握Java Swing组建的使用方法,包括窗口、框架、对话框、面板、文本编辑框、按钮、组合框等多种布局方式,掌握窗口菜单和快捷菜单设计方式。 2.理解委托时间处理模型,掌握不同组件、不同事件的事件处理方法,设计出能够响应事件的Java图形用户界面。 3.熟悉在组件上绘图的方法。 二、实验题目 用表格存储并显示个人所得税税率表,给定一个月收入值,计算应缴的个人所得税。 三、实验方法与步骤(需求分析、算法设计思路、流程图等) 算法设计思路:本次实验题目为计算个人所得税,所以本人从网上找到了国家最新的税收政策,以下为截图:

因此,我设计了以下核心算法 public void actionPerformed(ActionEvent e) { if(e.getSource()==button_b) { double wage=Double.parseDouble((String)text_wage.getText()); double tax = 0; if(wage<=3500) tax=0; if(wage>3500&&wage<=5000) tax=(wage-3500)*0.03; if(wage>5000&&wage<=8000) tax=(wage-3500)*0.1-105; if(wage>8000&&wage<=12500) tax=(wage-3500)*0.2-555; if(wage>12500&&wage<=38500)

实验五 Java图形界面及多线程

实验五图形界面及多线程 【实验目的】 一、掌握Jpanel的使用方法; 二、掌握JAVA简单图形界面的设计; 三、掌握JAVA多线程控制。 【实验内容】 一、在一个Jpanel中显示一个小球,当点击鼠标时,开始移动小球;当小球撞到Jpanel的边框时,小球将反弹回去继续移动。小球用一个线程来控制其移动; 二、每点击一次鼠标,增加一个移动的小球,最多产生20个小球,随机选择小球的颜色; 三、增加功能,当两个小球相撞时,它们将各自反弹。 【实验结果】 //小球类 import java.awt.Color; import java.awt.Point; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.util.Random; public class Ball { private double x; private double y; private double xR=30; private double yR=30; private double xMove; private double yMove; private Color color; private Ellipse2D shape; private static Random random=new Random(); public Ball(){ color=new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256)); xMove=Math.cos(random.nextDouble()*6.24)*10;

实验九Java图形用户界面设计1

实验九Java图形用户界面设计(1) 一实验目的 (1)掌握Frame与面板的使用 (2)布局管理器的使用 (3)布局管理器的使用 (4)边界风格的使用 (5)掌握简单Java事件的处理 二实验内容 1、创建并显示一个标题为“My Frame”,背景色为白色,大小为1000×1000的框架。在该框架中放置八个按钮,按钮的标题分别为“按钮1”、……“按钮8”。采用FlowLayout布局管理器。 程序: import java.awt.*; import javax.swing.*; public class Con1{ private JFrame f; private JButton b1,b2,b3,b4,b5,b6,b7,b8; public static void main(String args[]){ Con1 c=new Con1(); c.go(); } public void go(){

f=new JFrame("My Frame"); Container con=f.getContentPane(); con.setLayout(new FlowLayout()); con.setBackground(Color.white); con.setLayout(new FlowLayout(FlowLayout.RIGHT,920,50)); b1=new JButton("按键1"); b2=new JButton("按键2"); b3=new JButton("按键3"); b4=new JButton("按键4"); b5=new JButton("按键5"); b6=new JButton("按键6"); b7=new JButton("按键7"); b8=new JButton("按键8"); con.add(b1); c on.add(b2); c on.add(b3); c on.add(b4); con.add(b5); c on.add(b6); c on.add(b7); c on.add(b8); f.setSize(1000,1000); f.setVisible(true); } } 结果:

java图形界面实验报告材料

河南工业大学实验报告 专业班级:计科F1401 学号:姓名: 实验单元八 【实验目的】 1、掌握???????程序设计方法 2、掌握???????程序设计方法 3、掌握???????程序设计方法 4、掌握???????程序设计方法 5、掌握使用????程序设计方法。 【实验环境】 安装了jdk软件的PC机。 【实验内容】 第18章、图形界面。 【程序功能内容说明】 设置标签的显示字体、大小背景及颜色。 【实验程序原码】 import java.awt.Dimension ; import java.awt.Color ; import java.awt.Font ; import java.awt.Point ; import javax.swing.JLabel ; import javax.swing.JFrame ; public class JLabelDemo02{ public static void main(String args[]){ JFrame frame = new JFrame("Welcome To MLDN") ; JLabel lab = new JLabel("MLDN",JLabel.CENTER) ; // 实例化标签

对象 Font fnt = new Font("Serief",Font.ITALIC + Font.BOLD,28) ; lab.setFont(fnt) ; frame.add(lab) ; // 将组件件入到面板之中 Dimension dim = new Dimension() ; frame.setBackground(Color.WHITE) ;//设置窗体的背景颜色 dim.setSize(200,70) ; frame.setSize(dim) ; Point point = new Point(300,200) ; // 设置坐标 frame.setLocation(point) ; frame.setVisible(true) ; } }; 【实验结果】 【该程序关键技术说明】 JFrame作为基本容器用于创建窗口。 JLabel作为标签组件用于在窗口上的显示。

JAVA综合图形界面程序的设计说明

实验报告 (2013 / 2014 学年第二学期) 课程名称Java语言程序设计 实验名称综合图形界面程序设计 实验时间2014年5月5日 指导单位计算机学院软件教学中心 指导教师薛景 学生姓名周媛班级学号12001108 计算机科学与技术学院(系)计算机学院专业 (信息安全)

实验名称综合图形界面程序设计指导教师薛景 实验类型上机实验学时 2 实验时间2014-5-5 一、实验目的 1. 学习使用Java Swing设计GUI界面 2. 学习Java的事件监听机制的基本原理 3. 学习监听器处理Java中的事件 二、实验环境 1. 每位同学配备实验计算机一台 2. 安装JDK和Eclipse 三、实验内容 1、编写一个算数测试小软件,用来训练小学生的算数能力。程序有3个类组成,其中Teacher对象充当监视器,负责给出算术题目,并判断回答者的答案是否正确;ComputerFrame对象负责为算数题目提供视图,比如用户可以通过ComputerFrame对象提供的GUI界面看到题目,并通过该GUI界面给出题目的答案;MainClass是软件的主类。(请在下方空白处填写本程序的全部 ..程序代码及软件界面截图) public class Mainclass { public static void main(String args[]){ ComputerFrame frame; frame=new ComputerFrame(); frame.setTitle("算术测试"); frame.setBounds(100,100,650,180); } } import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComputerFrame extends JFrame{ JMenuBar menubar; JMenu choiceGrade; JMenuItem grade1,grade2; JTextField textOne,textTwo,textResult; JButton getProblem,giveAnswer; JLabel operatorLabel,message; Teacher teacherZhang; ComputerFrame(){

相关文档
相关文档 最新文档