JAVA画图板程序实验报告附完整代码分析.docx
《JAVA画图板程序实验报告附完整代码分析.docx》由会员分享,可在线阅读,更多相关《JAVA画图板程序实验报告附完整代码分析.docx(26页珍藏版)》请在冰豆网上搜索。
JAVA画图板程序实验报告附完整代码分析
画板程序
一、软件系统分析和设计方案
1、功能需求分析
设计类似于Windows画板的程序,程序可以通过功能菜单(或工具条)进行功能选择操作,在画板中可以用鼠标操作绘制不同颜色的点,直线,多边形和椭圆,可以保存和打开自定义的图形文件。
2、结构设计过程
经过对需求的分析,我们设计的画图板界面主要包括菜单栏、工具栏、画板三个部分。
菜单栏包含文件、编辑、帮助等常见功能菜单,实现打开保存文件等功能;工具栏主要包括画笔、矩形、椭圆、直线、刷子、橡皮、文字、颜色等工具,可完成一些基本操作;画板能够编辑处理图片及文字。
而代码实现上采用面向对象的思想,将上述组件封装与一个画板类中布局并实现功能;通过一个窗框类实现画板对象;最后在主类中建立窗框对象。
思路如下图:
二、软件实现和代码编写
具体代码及详细注释如下:
importjava.awt.*;
importjava.awt.event.*;
importjava.awt.geom.*;
importjavax.swing.*;
importjavax.swing.UIManager.*;
importjava.io.*;
importjava.util.Vector;
//主类建立窗框
publicclassDrawPad{
publicstaticvoidmain(String[]args){
try{//优化UI效果
for(LookAndFeelInfoinfo:
UIManager.getInstalledLookAndFeels()){
if("Nimbus".equals(info.getName())){
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}catch(Exceptione){
System.out.println(e);
}
newDrawFrame();
}
}
//添加窗口和画板组件
classDrawFrameextendsJFrame{
publicDrawFrame(){
DrawPanelpanel=newDrawPanel();
add(panel);
setTitle("简单JAVA画板");
setBounds(100,100,800,600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//定义绘画点的基本属性
classpositionimplementsSerializable{
intx;
inty;
inttype;
Strings;
Colorcolor;
}
//定义画板组件
classDrawPanelextendsJPanelimplementsActionListener,MouseListener,
MouseMotionListener{
JMenuBarmb;//菜单栏
JMenumenu1,menu2,menu3;
JMenuItemi1,i2,i3,i4;
JPaneljp1;//工具栏
publicJButtonanj0,anj1,anj2,anj3,anj4,anj5,anj6,anj7,anj8,anj9,
anj10;
JLabell1,lcolor;
Vectorthedraw=newVector();//保存画图轨迹的数组
intstyle=0;//保存画图类型,默认为画笔
intx1=0;//保存点的坐标
intx2=0;
inty1=0;
inty2=0;
Stringinput="";//默认输入文字内容
Colorlinecolor=Color.BLACK;//默认线的颜色
publicDrawPanel(){
setBackground(Color.WHITE);
setLayout(newBorderLayout());
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
//上部菜单栏
mb=newJMenuBar();
mb.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
add(mb,BorderLayout.NORTH);
//加入菜单栏的组件
menu1=newJMenu("文件");
menu2=newJMenu("编辑");
menu3=newJMenu("帮助");
i1=newJMenuItem("打开",newImageIcon(
"img/open.png"));
i2=newJMenuItem("保存",newImageIcon(
"img/save.png"));
i3=newJMenuItem("清空",newImageIcon(
"img/clear.png"));
i4=newJMenuItem("关于简单JAVA画板",newImageIcon(
"img/about.png"));
menu1.add(i1);
menu1.addSeparator();
menu1.add(i2);
menu2.add(i3);
menu3.add(i4);
mb.add(menu1);
mb.add(menu2);
mb.add(menu3);
add(mb,BorderLayout.NORTH);
//侧边工具栏
jp1=newJPanel();
jp1.setBackground(Color.LIGHT_GRAY);
jp1.setLayout(newBoxLayout(jp1,BoxLayout.Y_AXIS));
jp1.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
add(jp1,BorderLayout.WEST);
//加入工具栏的组件
anj0=newJButton("画笔",newImageIcon("img/pen.png"));
anj1=newJButton("刷子",newImageIcon("img/brush.png"));
anj2=newJButton("橡皮",newImageIcon("img/erease.png"));
anj3=newJButton("文字",newImageIcon("img/word.png"));
anj4=newJButton("直线",newImageIcon("img/sline.png"));
anj5=newJButton("矩形",newImageIcon("img/rec.png"));
anj6=newJButton("圆矩",newImageIcon("img/frec.png"));
anj7=newJButton("椭圆",newImageIcon("img/eli.png"));
anj10=newJButton("");
lcolor=newJLabel("■");//会变色的方块
l1=newJLabel("颜色");
anj10.add(lcolor);
anj10.add(l1);
jp1.add(anj0);
jp1.add(anj1);
jp1.add(anj2);
jp1.add(anj3);
jp1.add(anj4);
jp1.add(anj5);
jp1.add(anj6);
jp1.add(anj7);
jp1.add(anj10);
//事件处理
i1.addActionListener(this);
i2.addActionListener(this);
i3.addActionListener(this);
i4.addActionListener(this);
anj0.addActionListener(this);
anj1.addActionListener(this);
anj2.addActionListener(this);
anj3.addActionListener(this);
anj4.addActionListener(this);
anj5.addActionListener(this);
anj6.addActionListener(this);
anj7.addActionListener(this);
anj10.addActionListener(this);
addMouseListener(this);
addMouseMotionListener(this);
}
//记录鼠标选择的功能
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==anj0)
style=0;
elseif(e.getSource()==anj1)
style=1;
elseif(e.getSource()==anj2)
style=2;
elseif(e.getSource()==anj3){
style=3;
input=JOptionPane.showInputDialog("输入文字后在画板上点击放置");
}elseif(e.getSource()==anj4)
style=4;
elseif(e.getSource()==anj5)
style=5;
elseif(e.getSource()==anj6)
style=6;
elseif(e.getSource()==anj7)
style=7;
elseif(e.getSource()==anj10){
linecolor=JColorChooser.showDialog(null,"请选择颜色",Color.BLACK);
lcolor.setForeground(linecolor);
}elseif(e.getActionCommand()
.equals("关于简单JAVA画板")){
JOptionPane.showMessageDialog(null,
"这是一个简单的JAVA画板。
\n开发者:
B13070630\n2014年12月于南邮","关于",
JOptionPane.INFORMATION_MESSAGE);
}elseif(e.getActionCommand().equals("清空")){
thedraw.removeAllElements();
}elseif(e.getActionCommand().equals("保存")){
JFileChoosersfc=newJFileChooser();
intflag=-1;
//显示保存文件的对话框
try{
flag=sfc.showSaveDialog(this);
}catch(HeadlessExceptionhe){
System.out.println("SaveFileDialogException!
");
}
//获取选择文件的路径
if(flag==JFileChooser.APPROVE_OPTION){
Stringfilename=sfc.getSelectedFile().getPath();
try{
FileOutputStreamfos=newFileOutputStream(filename);
ObjectOutputStreamoos=newObjectOutputStream(fos);
oos.writeObject(thedraw);
oos.close();
}catch(Exceptiones){
System.out.println(es);
}
}
}elseif(e.getActionCommand().equals("打开")){
JFileChooserofc=newJFileChooser();
intflag=-1;
try{
flag=ofc.showOpenDialog(this);
}catch(HeadlessExceptionhe){
System.out.println("SaveFileDialogException!
");
}
//获取选择文件的路径
if(flag==JFileChooser.APPROVE_OPTION){
Stringfilename=ofc.getSelectedFile().getPath();
try{
FileInputStreamfis=newFileInputStream(filename);
ObjectInputStreamois=newObjectInputStream(fis);
thedraw=(Vector)ois.readObject();
ois.close();
}catch(Exceptiones){
System.out.println(es);
}
}
}
repaint();//刷新画板
}
//paintComponent方法调用绘制方法使在容器内绘制而不超出容器
publicvoidpaintComponent(Graphicsg){
super.paintComponent(g);
draw((Graphics2D)g);
}
//从数组中取出一个点后画图
publicvoiddraw(Graphics2Dg){
intn=thedraw.size();
positionp;
for(inti=0;itry{
p=thedraw.get(i);
if(p.type==0){//画笔
x1=x2=p.x;
y1=y2=p.y;
while(p.type==0){
x2=p.x;
y2=p.y;
Line2Dt=newLine2D.Double(x1,y1,x2,y2);
g.setColor(p.color);
g.draw(t);//递归画图
i++;
if(i==n){
i--;
break;
}
p=thedraw.get(i);
x1=x2;
y1=y2;
}
}
if(p.type==1){//刷子
while(p.type==1){
g.setColor(p.color);
g.drawString("●",p.x,p.y);//采用字符使点变大
i++;
if(i==n){
i--;
break;
}
p=thedraw.get(i);
}
}
if(p.type==2){//橡皮
while(p.type==2){
g.setColor(Color.WHITE);
g.drawString("■",p.x,p.y);//采用字符使点变大
i++;
if(i==n){
i--;
break;
}
p=thedraw.get(i);
}
}
if(p.type==3){//文字
while(p.type==3){
g.setColor(p.color);
g.drawString(p.s,p.x,p.y);//点状绘制实时字符
i++;
if(i==n){
i--;
break;
}
p=thedraw.get(i);
}
}
if(p.type==4){//直线
x1=p.x;
y1=p.y;
i++;
p=thedraw.get(i);
x2=p.x;
y2=p.y;
if(p.type==4){//不存在翻转问题,故不用交换坐标
Line2Dt=newLine2D.Double(x1,y1,x2,y2);
g.setColor(p.color);
g.draw(t);
thedraw.remove(i);
}elseif(p.type==-1){
Line2Dt=newLine2D.Double(x1,y1,x2,y2);
g.setColor(p.color);
g.draw(t);
}else
i--;
}
if(p.type==5){//矩形
x1=p.x;
y1=p.y;
i++;
p=thedraw.get(i);
x2=p.x;
y2=p.y;
if(x2inttemp;
temp=x1;
x1=x2;
x2=temp;
}
if(y2inttemp;
temp=y1;
y1=y2;
y2=temp;
}
if(p.type==5){//鼠标按下则动态变化
Rectangle2Dt=newRectangle2D.Double(x1,y1,x2-x1,
y2-y1);
g.setColor(p.color);
g.draw(t);
thedraw.remove(i);
}elseif(p.type==-1){//鼠标松开则固定绘图
Rectangle2Dt=newRectangle2D.Double(x1,y1,x2-x1,
y2-y1);
g.setColor(p.color);
g.draw(t);
}else
i--;
}
if(p.type==6){//圆角矩形
x1=p.x;
y1=p.y;
i++;
p=thedraw.get(i);
x2=p.x;
y2=p.y;
if(x2inttemp;
temp=x1;
x1=x2;
x2=temp;
}
if(y2inttemp;
temp=y1;
y1=y2;
y2=temp;
}
if(p.type==6){
RoundRectangle2Dt=newRoundRectangle2D.Double(x1,
y1,x2-x1,y2-y1,20,20);
g.setColor(p.color);
g.draw(t);
thedraw.remove(i);
}elseif(p.type==-1){
RoundRectangle2Dt=newRoundRectangle2D.Double(x1,
y1,x2-x1,y2-y1,20,20);
g.setColor(p.color);
g.draw(t);
}else
i--;
}
if(p.type==7){//椭圆
x1=p.x;
y1=p.y;
i++;
p=thedraw.get(i);