Java画图板程序设计报告

更新时间:2024-02-03 13:03:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

西安科技大学

Java语言课程设计报告

题目: 画图板应用程序开发 班级: 学号: 姓名:

2010年 12 月

1 / 31

目 录

1 设计题目及具体要求………………………………………………………3 2 总体设计……………………………………………………………………6 3 详细设计与实现……………………………………………………………4 4 系统测试……………………………………………………………………11 5 设计小结……………………………………………………………………31 参考文献

2 / 31

1、设计题目及具体要求

1.1 题目需求

1. 设计题目:小画图板的开发。 2. 重点分析

本软件的重难点为主窗体的设计、菜单栏和工具栏的设计、事件响应的处理、画图的基本功能的实现。

3. 实现功能

1. 新建一个空白图形文件:用于绘制新的图形。 2. 打开或保存一个图形文件,便于对图形文件的管理。

3. 绘制一些基本的图形组件:直线,矩形,实心矩形,椭圆,实心椭圆,圆,实心圆,

圆角矩形,实心圆角矩形等。

4. 用鼠标在绘图板上单击拖动进行随笔花。 5. 橡皮擦:可以将已绘制的图形擦掉。 6. 添加文字:可以在绘图区域内添加文字。

7. 选择文字的字体:通过一个下拉式的选择条,可以选中所需要的字体。本程序中包

括:宋体,隶书,华文彩云,仿宋-GB2312,华文行楷,Times New Roman,Serif,Monospaced,SonsSerif,Garamond。当然,在下面的程序分析中可以看到,由于设置了字体选择数组,使得可以随意添加系统支持的任何字体。大大方便和简化了程序设计。

8. 选择文字的字体风格:通过两个复选框按钮,可以选择需要的字体风格,包括:粗

体,斜体,用同时选中两者,只选择其中一种或两者都不选中3种选择方式。 9. 设置画笔的颜色:可以选择当前绘制图形的画笔颜色,让图形更加丰富多彩,生动

活泼。

10. 设置画笔的粗细:该选项在作用于基本图形组件和文字时,它的效果是不同的。当作用于绘制图形组建时,它的作用是改变画笔绘制线条的粗细;当作用于文字时,它的作用是改变文字的大小。

3 / 31

4. 功能图

画图板功能介绍菜单栏工具栏文件颜色线条新建打开保存铅笔直线空心矩形实心矩形空心圆实心圆空心椭圆新建保存打开退出设置颜色设置线条宽度空心实心圆角椭圆矩形实心橡皮圆角擦矩形颜色设置线条宽度设置添加文字字体选择粗体斜体图1-1 画图板应用程序功能结构图

1.2 实现环境及工具简介

CPU:Intel Core(TM)2 E5300 内存:2G 运行平台:Windows XP 主频:2.60GHz

开发平台:Eclipse 主板:ASUSTeK Computer INC. P5QL-ASUS-SE

Eclipse简介:

Eclipse——IBM的Java IDE开发环境

IBM-Eclipse简介:

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

4 / 31

IBM-Eclipse版本历史:

Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。 2003年,Eclipse 3.0选择OSGi服务平台规范为运行时架构。 2007年6月,稳定版3.3发布。2008年6月发布代号为Ganymede的3.4版。2009年7月发布代号为GALILEO的3.5版。2010年6月发布代号为Helios的3.6版。

IBM-Eclips语言拓展:

Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。

Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一个开发源码项目,它其实是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。

Eclipse 插件开发环境

虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。 基于 Eclipse 的应用程序的突出例子是 IBM 的 WebSphere Studio Workbench,它构成了 IBM Java 开发工具系列的基础。例如,WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、Web 服务和数据库访问的支持。

Eclipse的主要组成

Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开

5 / 31

发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。

Eclipse SDK

Eclipse SDK(软件开发者包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以 GPL发布,第三方组件有各自自身的许可协议。

2、总体设计

2.1 基本图形按钮

基本图形按钮包括:Pencil(随笔画)、Line(直线)、Rect(矩形)、fRect(实心矩形)、Oval(椭圆)、fOval(实心椭圆)、Circle(圆)、fCircle(实心圆)、RoundRect(圆角矩形)、frrect(实心圆角矩形)、Rubber(橡皮擦)、Word(字)。

基本图形都继承自同一个父类:drawings。Drawings具有的变量(属性): int x1, y1, x2, y2; //用来存放相应图形元素的左边 int R, G, B; //用来存放图形色彩信息 float stroke; //用来存放画笔粗细 int type; //用来保存图形类型

string s1; //用来保存输入文字字符串 string s2; //用来保存字体类型字符串 同时,drawings还有方法: Void draw(Graphics2D g2d) {};

draw()方法中用到了java绘图里面的Graphics2D类,所有继承drawings类的图形子类都重写此方法。这就是Java中类继承的概念。

2.2 基本操作按钮

1. New:新建一个图形文件。 2. Open:打开一个图形文件。 3. Save:保存当前图形文件。

2.3 菜单及其组成

1. File菜单项,包括:New(新建一个图形文件)、Load(打开一个图形文件)、Save

(保存一个图形文件)、Exit(退出程序)。 2. Color菜单项:用来设置当前颜色。

3. Stroke菜单项:用来设置当前画笔粗细。 4. Help菜单项:有关的程序帮助提示。

2.4 其他功能组成

1. 选择颜色和设置当前画笔粗细的按钮分别为:Color、Stroke。

6 / 31

2. 选择当前字体风格的选择框为:BOLD、ITALIC,用以设置当前字体的风格。 3. 选择当前字体的下来是复选框为:Styles。

2.5 完成的程序界面图为:

图2-1 完成的程序界面效果图

3、详细设计与实现

3.1 新建一个图形文件

单击工具栏上的图标始画面,如图4-1所示。

,或选择File? New菜单,则清除当前所绘制的图像,回到初

3.2 打开已有的文件

单击工具栏上的图标

,或选择File?Load菜单,则清除当前所绘制的图像,并弹

出打开文件对话框要求选择打开的文件,如图5-1所示。

7 / 31

图3-1 选择打开文件对话框

3.3 保存

单击工具栏上的图标

,或者选择File?Save菜单,则弹出要求保存文件对话框,如

图5-2所示。

图3-2 保存文件对话框

8 / 31

3.4 绘制基本图形

基本图形包括:

1. Pencil:随笔画,图标为2. Line:直线,图标为3. Rect:矩形,图标为

。 。

。 。

4. fRect:实心矩形,图标为5. Oval:椭圆,图标为

6. fOval:实心椭圆,图标为7. Circle:圆,图标为

8. Fcircle:实心圆,图标为。

。 。

9. RoundRect:圆角矩形,图标为10. frRect:实心圆角矩形,图标为11. Rubber:橡皮擦,图标为

画图时,单击工具栏上相应图形的图标,然后用鼠标拖动,在绘图区域内进行绘画即可。

3.5 设置画笔大小

单击工具栏上的图标,或者单击Stroke?Set Stroke菜单,则弹出相应的设置当前画笔粗细对话框,如图5-3所示。

图3-3 设置当前画笔粗细对话框

3.6 选择颜色

单击工具栏上的图标

,或单击Color?Choose Color菜单,则弹出相应的选择当前

9 / 31

画图颜色对话框,如图5-4所示。

图3-4 选择颜色对话框

3.7 选择字体风格

在工具栏区域

,可以选择相应的字体风格,有粗体和斜体两种风格可

供选择。

3.8选择字体

在工具栏区域

,可以选择字体,本程序中有如下几种字体可供选择:

宋体,隶书,华文彩云,仿宋-GB2312,华文行楷,Times New Roman,Serif,Monospaced,SonsSerif,Garamond。

3.9 程序结构说明

本程序主体文件为一个文件:MiniDrawPad.Java。其中包括的程序段有: 1. MiniDrawPad():构造函数,用以初始化。 2. chooseColor():选择当前绘图颜色程序段。 3. setStroke():设置当前画笔粗细程序段。 4. loadFile():调用图形文件程序段。 5. newFile():新建一个图形文件程序段。

10 / 31

6. saveFile():保存当前所绘制图形程序段。

7. createNewItem():新建一个基本图形单元程序段。

相应的内部类有:

1. ButtonHandler:用来处理基本图形单元的按钮事件。

2. ButtonHandler1:用来处理New、Open、Save三个操作按钮的按钮事件。 3. DrawPanel:用老创建绘图区域的子类。

4. MouseA:继承了MouseAdapter,用来完成鼠标相应事件的操作,如单击、松开、

进入和离开等。

5. MouseB:继承了MouseMotionAdapter,用来完成鼠标拖动和鼠标移动时的相应操

作。

4、系统测试

4.1 运行结果

1. 主界面框架 主界面类继承自JFrame类,包括构造函数及各种功能的定义,主要代码如下 :

import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*;

public class MiniDrawPad extends JFrame //主类,扩展了JFrame类,用来生成主界面 {

private ObjectInputStream input;

private ObjectOutputStream output; //定义输入输出流,用来调用和保存图像文件

private JButton choices[]; //按钮数组,存放以下名称的功能按钮

private String names[]={ \ \

\这三个是基本操作按钮,包括\新建\、\打开\、\保存\ \ \ \ \ \ \ \ \

//铅笔画,也就是用鼠标拖动着随意绘图 //绘制直线 //绘制空心矩形

//绘制以指定颜色填充的实心矩形 //绘制空心椭圆

//绘制以指定颜色填充的实心椭圆 //绘制圆形

//绘制以指定颜色填充的实心圆形

11 / 31

\//绘制空心圆角矩形 \ \ \ \ 变化

\ };

private String styleNames[]={

\宋体 \, \隶书 \, \华文彩云 \, \仿宋_GB2312 \, \华文行楷 \, \方正舒体 \\ }; //可供选择的字体项

private Icon items[];

private String tipText[]={

//这里是鼠标移动到相应按钮上面上停留时给出的提示说明条 \ \ \ \

\ \ \ \ \ \ \

\ \ \

\ \ \ };

JToolBar buttonPanel ;

//定义按钮面板

private JLabel statusBar; //显示鼠标状态的提示条

private DrawPanel drawingArea; //画图区域

private int width=800,height=550; //定义画图区域初始大小

12 / 31

//绘制以指定颜色填充的实心圆角矩形 //橡皮擦,可用来擦去已经绘制好的图案 //选择颜色按钮,可用来选择需要的颜色

//选择线条粗细的按钮,输入需要的数值可以实现绘图线条粗细的//输入文字按钮,可以在绘图板上实现文字输入

drawings[] itemList=new drawings[5000]; //用来存放基本图形的数组 private int currentChoice=3; //设置默认画图状态为随笔画 int index=0; //当前已经绘制的图形数目 private Color color=Color.black; //当前画笔颜色 int R,G,B; //用来存放当前色彩值

int f1,f2; //用来存放当前字体风格 String style1; //用来存放当前字体

private float stroke=1.0f; //设置画笔粗细,默认值为1.0f

JCheckBox bold,italic; //定义字体风格选择框

//bold为粗体,italic为斜体,二者可以同时使用 JComboBox styles;

public MiniDrawPad() //构造函数 {

super(\

JMenuBar bar=new JMenuBar(); //定义菜单条 JMenu fileMenu=new JMenu(\ fileMenu.setMnemonic('F');

2. 新建、保存、打开、退出菜单项 代码如下:

//新建文件菜单条

JMenuItem newItem=new JMenuItem(\ newItem.setMnemonic('N'); newItem.addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

newFile(); } } );

fileMenu.add(newItem);

//保存文件菜单项

JMenuItem saveItem=new JMenuItem(\ saveItem.setMnemonic('S'); saveItem.addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

saveFile(); }

//如果被触发,则调用保存文件函数段 //如果被触发,则调用新建文件函数段

13 / 31

} );

fileMenu.add(saveItem);

//打开文件菜单项

JMenuItem loadItem=new JMenuItem(\ loadItem.setMnemonic('L'); loadItem.addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

loadFile(); } } );

fileMenu.add(loadItem);

fileMenu.addSeparator();

//退出菜单项

JMenuItem exitItem=new JMenuItem(\ exitItem.setMnemonic('X'); exitItem.addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

System.exit(0); //如果被触发,则退出画图板程序 } } );

fileMenu.add(exitItem); bar.add(fileMenu);

//如果被触发,则调用打开文件函数段

3. 线条宽度、颜色、提示功能 代码如下:

//设置颜色菜单条

JMenu colorMenu=new JMenu(\ colorMenu.setMnemonic('C');

//选择颜色菜单项

JMenuItem colorItem=new JMenuItem(\ colorItem.setMnemonic('O'); colorItem.addActionListener( new ActionListener(){

14 / 31

public void actionPerformed(ActionEvent e) {

chooseColor(); //如果被触发,则调用选择颜色函数段 } } );

colorMenu.add(colorItem); bar.add(colorMenu);

//设置线条粗细菜单条

JMenu strokeMenu=new JMenu(\ strokeMenu.setMnemonic('S');

//设置线条粗细菜单项

JMenuItem strokeItem=new JMenuItem(\ strokeItem.setMnemonic('K'); strokeItem.addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

setStroke(); } } );

strokeMenu.add(strokeItem); bar.add(strokeMenu);

//设置提示菜单条

JMenu helpMenu=new JMenu(\ helpMenu.setMnemonic('H');

//设置提示菜单项

JMenuItem aboutItem=new JMenuItem(\ aboutItem.setMnemonic('A'); aboutItem.addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

JOptionPane.showMessageDialog(null,

\0808010208 \画图板程序说明 \INFORMATION_MESSAGE ); } } );

15 / 31

helpMenu.add(aboutItem); bar.add(helpMenu);

items=new ImageIcon[names.length];

4. 工具栏图形按钮功能实现

创建基本图形按钮、导入图标、加入动作侦听器、字体风格选择、字体选择、画图板等功能的实现。 代码如下:

//创建各种基本图形的按钮

drawingArea=new DrawPanel(); choices=new JButton[names.length];

buttonPanel = new JToolBar( JToolBar.VERTICAL ) ; buttonPanel = new JToolBar( JToolBar.HORIZONTAL) ; ButtonHandler handler=new ButtonHandler(); ButtonHandler1 handler1=new ButtonHandler1();

//导入图形图标,这些图标都存放在与源文件相同的目录下面 for(int i=0;i

items[i]=new ImageIcon(names[i] + \ choices[i]=new JButton(\ choices[i].setToolTipText(tipText[i]); buttonPanel.add(choices[i]); }

//将动作侦听器加入按钮里面

for(int i=3;i

choices[i].addActionListener(handler); }

choices[0].addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

newFile(); } } );

choices[1].addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

16 / 31

loadFile(); } } );

choices[2].addActionListener( new ActionListener(){

public void actionPerformed(ActionEvent e) {

saveFile(); } } );

choices[choices.length-3].addActionListener(handler1); choices[choices.length-2].addActionListener(handler1); choices[choices.length-1].addActionListener(handler1);

//字体风格选择

styles=new JComboBox(styleNames); styles.setMaximumRowCount(8); styles.addItemListener( new ItemListener(){

public void itemStateChanged(ItemEvent e) {

style1=styleNames[styles.getSelectedIndex()]; } } );

//字体选择

bold=new JCheckBox(\ italic=new JCheckBox(\

checkBoxHandler cHandler=new checkBoxHandler(); bold.addItemListener(cHandler); italic.addItemListener(cHandler); JPanel wordPanel=new JPanel(); buttonPanel.add(bold); buttonPanel.add(italic); buttonPanel.add(styles);

styles.setMinimumSize( new Dimension ( 50, 20 ) ); styles.setMaximumSize(new Dimension ( 100, 20 ) );

Container c=getContentPane(); super.setJMenuBar( bar );

17 / 31

c.add(buttonPanel,BorderLayout.NORTH); c.add(drawingArea,BorderLayout.CENTER);

statusBar=new JLabel();

c.add(statusBar,BorderLayout.SOUTH);

statusBar.setText(\

createNewItem(); setSize(width,height); show(); }

//按钮侦听器ButtonHanler类,内部类,用来侦听基本按钮的操作 public class ButtonHandler implements ActionListener {

public void actionPerformed(ActionEvent e) {

for(int j=3;j

if(e.getSource()==choices[j]) {currentChoice=j; createNewItem(); repaint();} } } }

//按钮侦听器ButtonHanler1类,用来侦听颜色选择、画笔粗细设置、文字输入按钮的操作 public class ButtonHandler1 implements ActionListener {

public void actionPerformed(ActionEvent e) {

if(e.getSource()==choices[choices.length-3]) {chooseColor();}

if(e.getSource()==choices[choices.length-2]) {setStroke();}

if(e.getSource()==choices[choices.length-1]) {JOptionPane.showMessageDialog(null,

\hit the drawing pad to choose the word input position\ \INFORMATION_MESSAGE ); currentChoice=14; createNewItem(); repaint(); }

18 / 31

} }

//鼠标事件mouseA类,继承了MouseAdapter,用来完成鼠标相应事件操作 class mouseA extends MouseAdapter {

public void mousePressed(MouseEvent e)

{statusBar.setText(\ \设置状态提示

itemList[index].x1=itemList[index].x2=e.getX(); itemList[index].y1=itemList[index].y2=e.getY();

//如果当前选择的图形是随笔画或者橡皮擦,则进行下面的操作 if(currentChoice==3||currentChoice==13) {

itemList[index].x1=itemList[index].x2=e.getX(); itemList[index].y1=itemList[index].y2=e.getY(); index++;

createNewItem(); }

//如果当前选择的图形式文字输入,则进行下面操作 if(currentChoice==14) {

itemList[index].x1=e.getX(); itemList[index].y1=e.getY();

String input;

input=JOptionPane.showInputDialog( \ itemList[index].s1=input; itemList[index].x2=f1; itemList[index].y2=f2; itemList[index].s2=style1;

index++;

currentChoice=14; createNewItem(); drawingArea.repaint(); } }

public void mouseReleased(MouseEvent e)

19 / 31

{statusBar.setText(\ \

if(currentChoice==3||currentChoice==13) {

itemList[index].x1=e.getX(); itemList[index].y1=e.getY(); }

itemList[index].x2=e.getX(); itemList[index].y2=e.getY(); repaint(); index++;

createNewItem(); }

public void mouseEntered(MouseEvent e) {

statusBar.setText(\ \ }

public void mouseExited(MouseEvent e) {

statusBar.setText(\ \ } }

class mouseB extends MouseMotionAdapter {

public void mouseDragged(MouseEvent e)

{statusBar.setText(\\

if(currentChoice==3||currentChoice==13) {

itemList[index-1].x1=itemList[index].x2=itemList[index].x1=e.getX();

itemList[index-1].y1=itemList[index].y2=itemList[index].y1=e.getY(); index++;

createNewItem(); } else {

itemList[index].x2=e.getX(); itemList[index].y2=e.getY(); }

20 / 31

repaint(); }

public void mouseMoved(MouseEvent e)

{statusBar.setText(\ \ }

//选择字体风格时候用到的事件侦听器类,加入到字体风格的选择框中 private class checkBoxHandler implements ItemListener {

public void itemStateChanged(ItemEvent e) {

if(e.getSource()==bold)

if(e.getStateChange()==ItemEvent.SELECTED) f1=Font.BOLD; else

f1=Font.PLAIN;

if(e.getSource()==italic)

if(e.getStateChange()==ItemEvent.SELECTED) f2=Font.ITALIC; else

f2=Font.PLAIN; } }

//画图面板类,用来画图

class DrawPanel extends JPanel {

public DrawPanel() {

setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); setBackground(Color.white); addMouseListener(new mouseA()); addMouseMotionListener(new mouseB()); }

public void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d=(Graphics2D)g; //定义画笔 int j=0;

while (j<=index) {

draw(g2d,itemList[j]);

21 / 31

j++; }

}

void draw(Graphics2D g2d,drawings i) {

i.draw(g2d);//将画笔传入到各个子类中,用来完成各自的绘图 } }

//新建一个画图基本单元对象的程序段 void createNewItem()

{ if(currentChoice==14)//进行相应的游标设置

drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));

else

drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

switch (currentChoice) {

case 3:

itemList[index]=new Pencil(); break; case 4:

itemList[index]=new Line(); break; case 5:

itemList[index]=new Rect(); break; case 6:

itemList[index]=new fillRect(); break; case 7:

itemList[index]=new Oval(); break; case 8:

itemList[index]=new fillOval(); break; case 9:

itemList[index]=new Circle(); break; case 10:

itemList[index]=new fillCircle(); break; case 11:

22 / 31

itemList[index]=new RoundRect(); break; case 12:

itemList[index]=new fillRoundRect(); break; case 13:

itemList[index]=new Rubber(); break; case 14:

itemList[index]=new Word(); break; }

itemList[index].type=currentChoice; itemList[index].R=R; itemList[index].G=G; itemList[index].B=B;

itemList[index].stroke=stroke; }

//选择当前颜色程序段

public void chooseColor() {

color=JColorChooser.showDialog(MiniDrawPad.this, \ R=color.getRed(); G=color.getGreen(); B=color.getBlue(); itemList[index].R=R; itemList[index].G=G; itemList[index].B=B; }

//选择当前线条粗细程序段 public void setStroke() {

String input;

input=JOptionPane.showInputDialog(

\ stroke=Float.parseFloat(input); itemList[index].stroke=stroke; }

//保存图形文件程序段

public void saveFile() {

23 / 31

JFileChooser fileChooser=new JFileChooser();

fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); int result =fileChooser.showSaveDialog(this); if(result==JFileChooser.CANCEL_OPTION) return ;

File fileName=fileChooser.getSelectedFile(); fileName.canWrite();

if (fileName==null||fileName.getName().equals(\

JOptionPane.showMessageDialog(fileChooser,\ \ERROR_MESSAGE); else{ try {

fileName.delete();

FileOutputStream fos=new FileOutputStream(fileName);

output=new ObjectOutputStream(fos); drawings record;

output.writeInt( index );

for(int i=0;i< index ;i++) {

drawings p= itemList[ i ] ; output.writeObject(p);

output.flush(); //将所有图形信息强制转换成父类线性化存储到文件中 } output.close(); fos.close(); }

catch(IOException ioe) {

ioe.printStackTrace(); } } }

//打开一个图形文件程序段 public void loadFile() {

JFileChooser fileChooser=new JFileChooser();

fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); int result =fileChooser.showOpenDialog(this); if(result==JFileChooser.CANCEL_OPTION) return ;

24 / 31

File fileName=fileChooser.getSelectedFile(); fileName.canRead();

if (fileName==null||fileName.getName().equals(\

JOptionPane.showMessageDialog(fileChooser,\ \ERROR_MESSAGE); else { try {

FileInputStream fis=new FileInputStream(fileName);

input=new ObjectInputStream(fis); drawings inputRecord;

int countNumber=0;

countNumber=input.readInt();

for(index=0;index< countNumber ;index++) {

inputRecord=(drawings)input.readObject(); itemList[ index ] = inputRecord ;

}

createNewItem(); input.close(); repaint(); }

catch(EOFException endofFileException){

JOptionPane.showMessageDialog(this,\ \ERROR_MESSAGE ); }

catch(ClassNotFoundException classNotFoundException){ JOptionPane.showMessageDialog(this,\Object\

\ERROR_MESSAGE ); }

catch (IOException ioException){

JOptionPane.showMessageDialog(this,\file\

\ERROR_MESSAGE ); } } }

//新建一个文件程序段

25 / 31

public void newFile() {

index=0;

currentChoice=3; color=Color.black; stroke=1.0f; createNewItem();

repaint();//将有关值设置为初始状态,并且重画 }

5. 各种画图功能的实现 代码如下:

//定义画图的基本图形单元

class drawings implements Serializable//父类,基本图形单元,用到串行化接口,保存时所用 {

int x1,y1,x2,y2; int R,G,B; float stroke; int type; String s1; String s2;

//定义坐标属性 //定义线条粗细属性 //定义色彩属性 //定义字体属性 //定义字体风格属性

void draw(Graphics2D g2d){};//定义绘图函数 }

class Line extends drawings //直线类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B)); g2d.setStroke(new BasicStroke(stroke,

BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL)); g2d.drawLine(x1,y1,x2,y2); } }

class Rect extends drawings//矩形类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke)); g2d.drawRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x1-x2),Math.abs(y1-y2)); }

26 / 31

}

class fillRect extends drawings//实心矩形类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke)); g2d.fillRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x1-x2),Math.abs(y1-y2)); } }

class Oval extends drawings//椭圆类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke)); g2d.drawOval(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x1-x2),Math.abs(y1-y2)); } }

class fillOval extends drawings//实心椭圆 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke)); g2d.fillOval(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x1-x2),Math.abs(y1-y2)); } }

class Circle extends drawings//圆类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke)); g2d.drawOval(Math.min(x1,x2),Math.min(y1,y2), Math.max(Math.abs(x1-x2),Math.abs(y1-y2)), Math.max(Math.abs(x1-x2),Math.abs(y1-y2)) ); } }

class fillCircle extends drawings//实心圆 {

void draw(Graphics2D g2d)

27 / 31

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke)); g2d.fillOval(Math.min(x1,x2),Math.min(y1,y2),

Math.max(Math.abs(x1-x2),Math.abs(y1-y2)), Math.max(Math.abs(x1-x2),Math.abs(y1-y2)) ); } }

class RoundRect extends drawings//圆角矩形类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke));

g2d.drawRoundRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x1-x2),Math.abs(y1-y2), 50,35); } }

class fillRoundRect extends drawings//实心圆角矩形类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke));

g2d.fillRoundRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x1-x2),Math.abs(y1-y2), 50,35); } }

class Pencil extends drawings//随笔画类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B)); g2d.setStroke(new BasicStroke(stroke,

BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL)); g2d.drawLine(x1,y1,x2,y2); } }

class Rubber extends drawings//橡皮擦类 {

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(255,255,255)); g2d.setStroke(new BasicStroke(stroke+4,

BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL));

28 / 31

g2d.drawLine(x1,y1,x2,y2); } }

class Word extends drawings//输入文字类 {

void draw(Graphics2D g2d) {

g2d.setPaint(new Color(R,G,B));

g2d.setFont(new Font(s2,x2+y2,((int)stroke)*18)); if (s1!= null )

g2d.drawString(s1,x1,y1); } }

6. 各功能运行结果

打开、保存、设置线宽、颜色设置功能图分别见3-1, 3-2,3-3, 3-4,这里不再赘述。

图4-1 画矩形、椭圆、圆形、圆角矩形、直线、铅笔功能实现图

29 / 31

图4-2 橡皮擦功能实现图

图4-3 添加文字、设置线宽、设置颜色功能图

30 / 31

图4-4 综合功能图

5 设计小结

通过这次的课程设计的学习,我学到了Java中开发图形应用程序的常用控件、事件处理机制、常用功能的实现,如文件读取、数据流的读取和管理、绘图显示等。 通过这次的学习,让我对面向对象的程序设计有一个总体的把握,从软件工程的角度看,有一个完整的脉络,如需求、分析、设计、实现、测试。在需求中,确定要实现一个类似Windows操作系统中的画板程序,并分析了要实现的功能,通过设计类图理清各个类成员之间的静态关系(即依赖关系)、它们之间的动态关系(即调用关系)。然后编码实现,通过运行验证实现效果。

在今后的学习开发中将一直依据这一原则进行相关的开发。因此自己需要对这一过程有一个大体的认识。

参考文献

1. 黄晓东.Java课程设计案例精编(第二版).中国水利水电出版社。2007 2. 谭浩强.Java软件编程实例教程.北京.清华大学出版社.2008.9

3. 【美】John Lewis William Loftus. Java Software Solutions Foundations of Program Design,Sixth Edition.北京. 电子工业出版社,2009.6 4. 荆涛. 数据库平台及开发工具选择.农经纵横, 1999 (5) : 77~ 79

31 / 31

图4-4 综合功能图

5 设计小结

通过这次的课程设计的学习,我学到了Java中开发图形应用程序的常用控件、事件处理机制、常用功能的实现,如文件读取、数据流的读取和管理、绘图显示等。 通过这次的学习,让我对面向对象的程序设计有一个总体的把握,从软件工程的角度看,有一个完整的脉络,如需求、分析、设计、实现、测试。在需求中,确定要实现一个类似Windows操作系统中的画板程序,并分析了要实现的功能,通过设计类图理清各个类成员之间的静态关系(即依赖关系)、它们之间的动态关系(即调用关系)。然后编码实现,通过运行验证实现效果。

在今后的学习开发中将一直依据这一原则进行相关的开发。因此自己需要对这一过程有一个大体的认识。

参考文献

1. 黄晓东.Java课程设计案例精编(第二版).中国水利水电出版社。2007 2. 谭浩强.Java软件编程实例教程.北京.清华大学出版社.2008.9

3. 【美】John Lewis William Loftus. Java Software Solutions Foundations of Program Design,Sixth Edition.北京. 电子工业出版社,2009.6 4. 荆涛. 数据库平台及开发工具选择.农经纵横, 1999 (5) : 77~ 79

31 / 31

本文来源:https://www.bwwdw.com/article/a95w.html

Top