Java画板实验报告.docx
《Java画板实验报告.docx》由会员分享,可在线阅读,更多相关《Java画板实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
![Java画板实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/29/8926f4ec-3f11-4f29-a16d-d3d763db9c87/8926f4ec-3f11-4f29-a16d-d3d763db9c871.gif)
Java画板实验报告
二、Java画板的设计
一、实验名称及其要求
A、实验名称:
Java画板的设计
B、实验要求:
1.实验目的:
图形界面设计。
熟悉java.awt包中的组件,掌握图形界面设计方法,理解委托事件处理模型。
2.实验要求:
(1)设计图形界面添加菜单:
窗口上添加各种组件及菜单,并处理组件及菜单的事件监听程序。
(2)实现画板的基本功能。
二、程序设计
本程序完成的是一个类似于Windows画图板的绘图程序。
由于不是开发和设计专业的绘图和图像制作软件,所以,完成的程序的简单功能包括以下几项:
1.新建一个空白图形文件:
用于绘制新的图形。
2.打开或保存一个图形文件,便于对图形文件的管理。
3.绘制一些基本的画图组件:
直线、矩形、实心矩形、椭圆、实心椭圆、圆、实心圆、圆角矩形、实心圆角矩形等。
4.可以用鼠标在绘图面板上单击拖动进行随笔画。
5.橡皮擦:
可以将已绘制好的图形擦掉。
6.添加文字:
可以在绘图区域内添加文字。
7.选择文字的字体:
通过一个下拉式的选择条,可以选中所需要的字体。
本程序中包括:
宋体、隶书、华文彩云、仿宋、华文行楷、方正舒体、TimesNewRoman、Serif、Monospaced、SonsSerif、Garamond。
当然,在下面的的程序分析中可以看到,由于我们灵活设置了字体数组,是的可以随意添加系统支持的任何字体。
大大方便和简化了程序设计。
8.选择文字的字体风格:
通过两个复选框按钮,可以选择需要的字体风格,包括:
粗体、斜体,使用者有三种选择方式,包括:
①同时选中两者、②只选择其中一种、③两者都不选中。
9.设置画笔的颜色:
可以选择当前绘制图形的画笔颜色,让图形更加丰富多彩、生动活泼。
10.设置画笔的粗细:
该选项在作用于基本图形组件和文字时,它的效果是不一样的。
①当作用于绘制图形组件时,它的作用是改变画笔绘制线条的粗细;②当作用于文字时,它的作用是改变文字的大小。
由此可以看到,虽然我们的画图板程序不及那些专业的绘图程序,但是,“麻雀虽小,五脏俱全”,它已经具备了一个绘图软件所应该有的基本功能和操作。
通过对本程序的分析,我们可以更加系统地学习和了解如何从整体上设计和实现一个程序。
(一):
程序基本组成框架和结构
1.一组基本图形按钮,包括:
pencil(随笔画)、line(直线)、rect(矩形)、frect(实心矩形)、oval(椭圆)、foval(实心椭圆)、circle(圆)、fcircle(实心圆)、roundrect(圆角矩形)、frrect(实心圆角矩形)、rubber(橡皮擦)、word(文字)。
这些基本图形都继承于同一个父类:
drawings。
drawings具有变量(属性):
intx1,x2,y1,y2;//用来存放相应图形元素的坐标
intR,G,B;//用来存放图形色彩颜色信息
floatstroke;//用来存放画笔粗细
inttype;//用来保存图形类型
Strings1;//用来保存输入文字字符串
Strings2;//用来保存字体类型字符串
同时,drawing还具有方法:
voiddraw(Graphics2Dg2d){};
draw()方法中用到了Java绘图里面的Graphics2D类,所有继承drawings类的图形子类都重写了此方法。
这就是Java程序中类的继承的概念。
它对于程序代码的重用是很重要的,将极大的方便和简略程序代码。
2.此外,程序中还包括一下三个基本操作按钮:
1新建(New):
新建一个图形文件。
2打开(Open):
打开一个图形文件。
3保存(Save):
保存当前图形文件。
3.选择颜色和设置当前画笔粗细的按钮分别为:
颜色(Color)、线条粗细(Stroke)。
4.选择当前字体风格的选择框为:
粗体(BOLD)、斜体(ITALIC),用以设置当前字体的风格。
5.选择当前字体的下拉式复选框为:
Styles。
6.菜单条及其组成:
1文件(File)菜单项,包括:
New(新建一个图形文件)、Load(打开一个图形文件)、Save(保存当前图形文件)、Exit(退出程序)。
2颜色(Color)菜单项:
用来设置当前颜色。
3线条粗细(Stroke)菜单项:
用来设置当前画笔粗细。
4帮助(Help)菜单项:
有关的程序帮助提示。
完成的程序界面效果如下图:
二):
画图板相关操作
1.新建一个图形文件
选择File→New菜单,则清除当前所绘制的图像,回到初始画面。
2.打开已有的文件
选择File→Load菜单,则清除当前所绘制的图像,并弹出打开文件对话框要求选择要打开的文件。
如下图:
3.保存
选择File→Save菜单,则弹出要求保存文件对话框。
4.绘制基本图形
基本图形包括以下几种:
pencil:
随笔画,图标为:
。
line:
直线,图标为:
。
rect:
矩形,图标为:
。
frect:
实心矩形,图标为:
。
oval:
椭圆,图标为:
。
foval:
实心椭圆,图标为:
。
circle:
圆,图标为:
。
fcircle:
实心圆,图标为:
。
roundrect:
圆角矩形,图标为:
。
frrect:
实心圆角矩形,图标为:
。
Rrubber:
橡皮擦,图标为:
。
绘图时,单击工具栏上相应图形的图标,然后用鼠标拖动,在绘图区域内进行绘图即可。
5.设置画笔大小
单击工具栏上的图标
,或单击Stroke→SetStroke菜单,则弹出相应的设置当前画笔粗细对话框。
如下图:
6.选择颜色
单击工具栏区域
,或单击Color→ChooseColor菜单,则弹出相应的选择当前画图颜色对话框。
如下图:
1.选择字体风格
在工具栏区域
,可以选择相应的字体风格,有粗体、斜体和粗斜体三种可供选择。
2.选择字体
在工具栏区域
,可以选择字体,本程序中有如下几种字体可供选择:
宋体、隶书、华文彩云、仿宋、华文行楷、方正舒体、TimeNewRoman、Serif、Monospaced、SonsSerif、Garamond。
三:
系统功能设计分析
画板主要由以下几个部分组成:
1.主窗体的设计。
主类(DrawPad)用来生成主界面,完成画图板的主要框架。
主类由JFrame派生出来。
主界面由菜单栏、工具栏和画图区域三部分组成,布局格式采用BorderLayout布局形式。
2.菜单栏和工具栏的设计。
菜单栏包括文件菜单栏、颜色菜单栏、线条粗细菜单栏和提示菜单栏。
其中①文件菜单栏包括文件的新建、打开、保存等选项;②颜色菜单栏可以进行颜色选择;③线条粗细菜单栏设置线条的粗细;④提示菜单栏给出提示信息。
工具栏由新建、打开和保存文件按钮、基本图形的按钮、选择字体风格复选框和字体下拉列表框组成。
在主类中添加并对菜单栏和工具栏添加事件监听。
3.事件响应的处理。
对菜单栏、工具栏和用鼠标画图的事件响应进行处理。
1菜单栏中文件的新建、打开和保存菜单事件的处理:
Java把每个文件都视作顺序字节流。
如果要在Java中进行文件处理,则必须用到Java.io包。
这个包定义了一些流类,选用FileInputStream(从文件中读入数据)和FIleOutputStream(向文件输出数据),通过建立这些文件的对象便可以打开文件。
这些流相应地从InputStream和OutputStream派生,这些文件均使用文件流,所以必须将文件结构化以适应程序的要求。
我们需要对保存的对象序列化,然后以输出流的方式保存。
在程序中用newFile()、loadFile()和saveFile()三个函数分别实现文件的新建、打开和保存。
2工具栏事件的处理:
主要有一些Button组成。
我们用ButtonHandler内部类处理基本单元事件,ButtonHandler1内部类处理新建、打开和保存文件按钮,在画图类DrawPanel中定义CreateNewItem()函数处理工具栏中的画图事件。
3鼠标画图:
由于画图板主要是用来画图,所以需要在程序中添加对鼠标按下、拖动、进入、退出、移动和单机事件进行监听并进行处理。
内部类mouseA定义了完成鼠标按下、松开、进入、退出事件响应。
内部类mouseB完成鼠标拖动和移动事件响应。
4.画图的基本功能。
在程序设计中用到了动态绑定,我们可以提取他们的公共属性,先建立一个父类,然后建立各个子类,继承父类中的方法并将父类中的draw函数重写。
一些关于图形形状的类,最主要是用于画图、字体和橡皮擦等基本类型。
如Circle、Triangle、Rectangle,它们都是有超类(Object类)派生的。
在面向对象编程中,每个类都有画出自己的能力,每个类都有自己的draw函数,但每种形状的draw函数都不一样,但在绘制任何形状时,只需简单调用父类drawing的draw方法,然后让程序动态地根据对象的类型决定使用哪个子类的draw方法。
为了使画出的图形更加美观,我们在draw函数中使用了Graphics2D的对象的引用。
这样可以在不改变原程序的情况下,添加扩展的图形,是程序变得更加强大。
同时,为了文件的保存,父类实现Serialize接口,将对象线性化。
四:
程序结构说明
本程序主体为一个文件:
QingDrawPad.java。
其中包括的程序段有:
1DrawPad():
构造函数,用以初始化。
2chooseColor():
选择当前绘图颜色程序段。
3setStroke():
设置当前画笔粗细程序段。
4loadFile():
调用图形文件程序段。
5newFile():
新建一个图形文件程序段。
6saveFile():
保存当前所绘制图形程序段。
7creatNewItem():
新建一个基本图形单元程序段。
相应的内部类有:
1ButtonHandler:
用来处理基本图形单元的按钮事件。
2ButtonHandler1:
用来处理New、Open、Save三个操作按钮的按钮事件。
3DrawPanel:
用来创建绘图区域的子类。
4MouseA:
继承了MouseAdapter,用来完成鼠标相应事件的操作,如单击、松开、进入和离开等。
5MouseB:
继承了MouseMotionAdapter,用来完成鼠标拖动和鼠标移动的相应事件操作。
此外,还继承了父类drawings的基本图形子类,如前所述,这里不再重复。
五:
程序绘图效果示意图
我们可以看到,整个程序界面很简洁,而且界面操作、提示内容全部是中文,一目了然。
在左上方的菜单栏里有文件、颜色、线条粗细、帮助4个下拉式菜单,可以对绘图文件进行相应的操作。
下面一排是工具栏的工具按钮,从左到右依次为:
新建文件、打开文件、保存文件、随笔画、直线、空心矩形、实心矩形、空心椭圆、空心圆、实心圆、空心圆角矩形、实心圆角矩形、橡皮擦、颜色选择按钮、线条粗细设置按钮、文字添加按钮、粗体字体选择框、斜体字体选择框、字体选择下拉式选择框。
整个工具栏是可以拖动的,可以将它拖动到程序窗口的任意位置。
工具栏下面的整个白色区域就是绘图区域,即绘图面板,它的大小可以随着窗口的大小自动调整。
在窗口的最底部是程序设计作者标注,以及鼠标状态提示条,可以显示当前的鼠标状态,包括进出窗口、移动、单击、松开等。
具体效果如下列图所示:
importjava.awt.*;
importjava.awt.geom.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.io.*;
importjava.util.*;
publicclassDrawPadextendsJFrame//主类,扩展了JFrame类,用来生成主界面
{
privateObjectInputStreaminput;
privateObjectOutputStreamoutput;//定义输入输出流,用来调用和保存图像文件
privateJButtonchoices[];//按钮数组,存放以下名称的功能按钮
privateStringnames[]={"New",
"Open",
"Save",//这三个是基本操作按钮,包括"新建"、"打开"、"保存"
/*下面是我们的画图板上面有的基本的几个绘图单元按钮*/
"pen","line","rect","frect","oval","foval","circle",
"fcircle","roundrect","frect","rubber","color","stroke",
"word"};
privateStringstyleNames[]={"宋体","隶书","华文彩云","仿宋",
"华文行楷","方正舒体","TimesNewRoman","Serif","Monospaced",
"SonsSerif","Garamond"};
privateIconitems[];
privateStringtipText[]={
//这里是鼠标移动到相应按钮上面上停留时给出的提示说明条
"新建一个文件","打开一个文件","保存当前文件","绘制线条","绘制直线","绘制空心矩形","绘制实心矩形",
"绘制空心椭圆","绘制实心椭圆","绘制空心圆形","绘制实心圆形","绘制空心圆角矩形","绘制实心圆角矩形",
"橡皮擦","选择颜色","设置线条粗细","输入文字"};
JToolBarbuttonPanel;//定义按钮面板
privateJLabelstatusBar;//显示鼠标状态的提示条
privateDrawPaneldrawingArea;//画图区域
privateintwidth=850,height=550;
drawings[]itemList=newdrawings[5000];//用来存放基本图形的数组
privateintcurrentChoice=3;//设置默认画图状态为随笔画
intindex=0;//当前已经绘制的图形数目
privateColorcolor=Color.black;//当前画笔颜色
intR,G,B;//用来存放当前色彩值
intf1,f2;//用来存放当前字体风格
Stringstyle1;//用来存放当前字体
privatefloatstroke=1.0f;//设置画笔粗细,默认值为1.0f
JCheckBoxbold,italic;
//bold为粗体,italic为斜体,二者可以同时使用
JComboBoxstyles;
publicDrawPad(){
super("绘图画板(中国风)");
JMenuBarbar=newJMenuBar();//定义菜单条
JMenufileMenu=newJMenu("文件");
//新建文件菜单条
JMenuItemnewItem=newJMenuItem("新建");
newItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
newFile();//如果被触发,则调用新建文件函数段
}
});
fileMenu.add(newItem);
//保存文件菜单项
JMenuItemsaveItem=newJMenuItem("保存");
saveItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
saveFile();//如果被触发,则调用保存文件函数段
}
});
fileMenu.add(saveItem);
//打开文件菜单项
JMenuItemloadItem=newJMenuItem("打开");
loadItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
loadFile();//如果被触发,则调用打开文件函数段
}
});
fileMenu.add(loadItem);
fileMenu.addSeparator();
//退出菜单项
JMenuItemexitItem=newJMenuItem("退出");
exitItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
System.exit(0);//如果被触发,则退出画图板程序
}
});
fileMenu.add(exitItem);
bar.add(fileMenu);
//设置颜色菜单条
JMenucolorMenu=newJMenu("颜色");
//选择颜色菜单项
JMenuItemcolorItem=newJMenuItem("选择颜色");
colorItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
chooseColor();//如果被触发,则调用选择颜色函数段
}
});
colorMenu.add(colorItem);
bar.add(colorMenu);
//设置线条粗细菜单条
JMenustrokeMenu=newJMenu("线条粗细");
//设置线条粗细菜单项
JMenuItemstrokeItem=newJMenuItem("设置线条粗细");
strokeItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
setStroke();
}
});
strokeMenu.add(strokeItem);
bar.add(strokeMenu);
//设置提示菜单条
JMenuhelpMenu=newJMenu("帮助");
//设置提示菜单项
JMenuItemaboutItem=newJMenuItem("关于画板");
aboutItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
JOptionPane.showMessageDialog(null,"此软件仅用于测试",
"画图板说明",JOptionPane.INFORMATION_MESSAGE);
}
});
helpMenu.add(aboutItem);
bar.add(helpMenu);
items=newImageIcon[names.length];
//创建各种基本图形的按钮
drawingArea=newDrawPanel();
choices=newJButton[names.length];
buttonPanel=newJToolBar(JToolBar.VERTICAL);
buttonPanel=newJToolBar(JToolBar.HORIZONTAL);
ButtonHandlerhandler=newButtonHandler();
ButtonHandler1handler1=newButtonHandler1();
//导入我们需要的图形图标,这些图标都存放在与源文件相同的目录下面
for(inti=3;iitems[i]=newImageIcon("F:
\\eclipse\\eclipse\\workspace\\Test\\src\\icon\\"+names[i]+".jpg");
choices[i]=newJButton(items[i]);
choices[i].setToolTipText(tipText[i]);
buttonPanel.add(choices[i]);
}
//将动作侦听器加入按钮里面
for(inti=3;ichoices[i].addActionListener(handler);
}
/*choices[0].addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
newFile();
}
});
choices[1].addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
loadFile();
}
});
choices[2].addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
saveFile();
}
});*/
choices[choices.length-3].addActionListener(handler1);
choices[choices.length-2].addActionListener(handler1);
choices[choices.length-1].addActionListener(handler1);
//字体风格选择
styles=newJComboBox(styleNames);