中文摘要
该程序是一个图形用户界面的JAVA图形编辑系统,由于需要丰富的用户界面组件,该图形编辑系统界面采用了Swing包,该程序实现了图形编辑系统的基本功能 :新建文件、打开文件、保存文件、退出编辑系统等文件功能,还有用铅笔随手画,画直线,矩形,椭圆,圆等基本图形的绘画功能,还可以在更多图形菜单栏中选择绘画带填充的图形,该图形编辑器还带有文字输入功能(图形文字),可以选择字体类型(正常,粗体,斜体),在操作的时候可以选择线条的粗细和颜色,橡皮擦功能可以帮助修改绘制的图形文字。
在设计的时候考虑到在执行不同的操作的时候鼠标的形状也会随着改变,比如:在用铅笔绘画的时候鼠标的形状就显现是一只铅笔的样子,在用橡皮擦的时候鼠标就转换成一个黑的小填充园进行擦除,由于时间的关系最终没有实现
对于图形编辑系统,用鼠标拖动,删除图形是一个技术性的难点,以后会加强学习,实现此功能。
目 录
一 、 题目内容及要求………………………………………5
二 、 设计思路………………………………………………5
三 、 具体实现………………………………………………8
四 、 运行调试和分析讨论…………………………………15
五 、 设计体会和小结………………………………………17
六 、 致谢……………………………………………………18
七 、 参考文献………………………………………………18
- 题目内容及要求
制作一个友好的图形用户界面,操作简单易行的图形编辑系统,其具体要求如下:
(1)能用拖橡皮筋的手法绘制各类图形(直线、椭圆、矩形、文字)
(2)支持画笔颜色、文字大小设置;
(3)能将画面中的所有图形存储到文件中;
(4)能从文件读取图形进行增补;
(5)采用对话框获取图形文件名。
(6)也可以思考一先如何利用鼠标选取图形,删除
- 设计思路
1、功能规划
将主界面设置为当前Windows风格的,然后在一个Container里设置菜单区域,常用功能区域,绘图区域和状态栏。
菜单区域设置“文件”(新建,保存,打开,退出)用来对文件的不同操作,“更多形状”(画实心矩形,实心圆,实心椭圆)用来扩充绘画功能,“颜色”用来通过调用系统颜色面板选择线条颜色,“帮助”用来添加一些附加信息,画板,作者的介绍等;
常用功能区域里面添加了铅笔,直线,矩形,椭圆,圆,橡皮擦,粗细,文字等常用功能按钮用来完成不同的操作,还安置了两个复选框(粗体,斜体)来设置图形式文字输入的状态。排在North位置
绘图区域用来实现操作的操作显示平台,排在Center位置
状态栏主要用来纪录鼠标的坐标改变, 放在South位置
2、工作原理图
3、 打开已保存的图形文件
4、保存绘制的图形
- 具体实现
- 用户自定义类
类名:Huaban
作用:生成主界面
继承的父类:JFrame
主要的类成员:
private ObjectInputStream input;
private ObjectOutputStream output;输入输出流,打开和保存图像
private JButton choices[];存放功能按钮
private String names[ ]={ 存放功能按钮的名字 };
private String tipText[]={鼠标放到功能按钮上的提示语}
private Icon items[];存放各功能按钮的Icon
Icon wei=new ImageIcon("wang.gif") ;//介绍我的
Icon icon=new ImageIcon("mm.gif") ;//说明的ICON
Icon icon1=new ImageIcon("nn.gif") ;//输入文字的ICON
JToolBar buttonPanel ; //定义功能按钮面板
ButtonHandler handler=new ButtonHandler();功能按钮监听1
ButtonHandler1 handler1=new ButtonHandler1();功能按钮监听2
private JLabel statusBar; //显示鼠标状态的提示条
private DrawPanel drawingArea;//画图区域
drawings[] itemList=new drawings[5000];//存放基本图形的大数组
int index=0; //当前已经绘制的图形数目,图形数组下标
private Color color=Color.black;//当前画笔颜色
JCheckBox bold,italic;//两个字体选择复选框
//开始构造函数Huaban()
JMenuBar bar=new JMenuBar(); //定义菜单显示bar
JMenu fileMenu=new JMenu("文件(F)")//定义文件菜单
JMenuItem newItem=new JMenuItem("新建(N)");
JMenuItem saveItem=new JMenuItem("保存(S)");
JMenuItem openItem=new JMenuItem("打开(L)");
JMenuItem exitItem=new JMenuItem("退出(X)");//文件菜单项
JMenu shapeMenu=new JMenu("更多形状(P)");//绘图菜单
JMenuItem frectItem=new JMenuItem("画实心矩形(F)");
JMenuItem fovalItem=new JMenuItem("画实心椭圆(T)");
JMenuItem fcircleItem=new JMenuItem("画实心圆(Q)");//菜单项
JMenu colorMenu=new JMenu("颜色(C)")//颜色菜单
JMenuItem colorItem=new JMenuItem("选择颜色(O)");//菜单项
JMenu helpMenu=new JMenu("帮助(H)")//帮助菜单
JMenuItem aboutItem=new JMenuItem("关于mini画板!(A)");
JMenuItem howItem=new JMenuItem("帮助主题(W)");//帮助菜单项
对于定义的一些菜单和菜单项通过bar.add(X)和X.add(Y)来添加到主界面中去的,并且同过函数setMnemonic()来设置这些菜单或菜单项的快捷键,然后通过
X.addActionListener (
new ActionListener() {
public void actionPerformed(ActionEvent e)
{ 触发相应方法事件 }
来实现对菜单项的事件出发。
//创建各种基本图形的按钮 ,排列功能按钮面板 buttonPanel
items=new ImageIcon[names.length];
choices=new JButton[names.length];
buttonPanel = new JToolBar( JToolBar.VERTICAL ) ;
buttonPanel = new JToolBar( JToolBar.HORIZONTAL) ;
//导入图形图标,在功能按钮上加上Icon和提示语tipText[i]
for(int i=3;i<choices.length;i++)
{items[i]=new ImageIcon(names[i] + ".gif");
choices[i]=new JButton("",items[i]);
choices[i].setPreferredSize(new Dimension(35,30));
choices[i].setToolTipText(tipText[i]);
buttonPanel.add(choices[i]);//添加按钮实体
}
//添加对按钮的监听,基本监听者handler注册
for(int i=3;i<choices.length-2;i++)
{ choices[i].addActionListener(handler);
currentChoice=j; //对监听到绘制函数中做相应调用}
//触发弹出对话框监听者 handler1 注册
choices[choices.length-2].addActionListener(handler1);
choices[choices.length-1].addActionListener(handler1);
//创建和添加字体选择复选框,鼠标状态提示条以及注册
bold=new JCheckBox("粗体");
italic=new JCheckBox("斜体字");
checkBoxHandler cHandler=new checkBoxHandler();
bold.addItemListener(cHandler);
italic.addItemListener(cHandler);事件注册
buttonPanel.add(bold);
buttonPanel.add(italic);
statusBar=new JLabel();
statusBar.setText(" 欢迎使用迷你画板1.00版~_~!!! ");
//设计JFrame整体布局
Container c=getContentPane();
super.setJMenuBar( bar );
c.add(buttonPanel,BorderLayout.NORTH);
c.add(drawingArea,BorderLayout.CENTER);
c.add(statusBar,BorderLayout.SOUTH);
createNewItem();//创建基本图形绘制区域,默认为Pencil绘画
setSize(720,450);
setVisible(true);
//构造函数结束,
类名:ButtonHandler
作用:按钮监听器,监听基本的绘图操作
继承的父类:ActionListener
public class ButtonHandler implements ActionListener
{ public void actionPerformed(ActionEvent e)
{ for(int j=1;j<choices.length-2;j++)
{ if(e.getSource()==choices[j])
{ currentChoice=j;
createNewItem();
repaint();}
类名:ButtonHandler1
作用:按钮监听器,监听改线条粗细和添加图形文字
继承的父类:ActionListener
public class ButtonHandler1 implements ActionListener
{ public void actionPerformed(ActionEvent e)
{ if(e.getSource()==choices[choices.length-2])
{ setStroke(); }
if(e.getSource()==choices[choices.length-1])
{ JOptionPane.showMessageDialog(null,
"你可以点击画板用来添加文字!",
"文字输入:",
JOptionPane.INFORMATION_MESSAGE,icon1 );
currentChoice=9;
createNewItem();
repaint();
} } }
类名:drawings
作用:定义基本图形单元
继承的父类:Serializable
主要成员变量:
int x1,y1,x2,y2; //坐标属性
int R,G,B;
float brush; //定义线条粗细属性
int type; //定义字体属性
String s1;
String s2; //定义字体风格属性
void draw(Graphics2D g2d){}
类名:DrawPanel
作用:画图面板,用来绘画
继承的父类:JPanel
class DrawPanel extends JPanel
{ public DrawPanel(){
setCursor(Cursor.getPredefinedCursor
(Cursor.CROSSHAIR_CURSOR));
setBackground(Color.white);
addMouseListener(new mouseA());注册事件mouseA()
addMouseMotionListener(new mouseB());注册事件mouseB()
}
public void paintComponent(Graphics g)
{ super.paintComponent(g);
Graphics2D g2d=(Graphics2D)g; //定义画笔
int j=0;
while (j<=index)
{ draw(g2d,itemList[j]);
j++;}
}
void draw(Graphics2D g2d,drawings i)
{ i.draw(g2d);} //用来完成各子类的绘图
}
类名:mouseA
作用:用来完成鼠标相应事件操作
继承的父类:MouseAdapter
class mouseA extends MouseAdapter{
public void mousePressed(MouseEvent e){
在状态栏显示鼠标位置;
纪录鼠标的坐标;
if (当前为随笔画或橡皮擦){将当前位置作为
起点和重点的位置,执行绘画函数}
if (当前文字输入){当前坐标作为起点位置,
终点位置赋空值,执行绘画函数 }
}
public void mouseReleased(MouseEvent e){
在状态栏显示鼠标位置
if (当前为随笔画或橡皮擦){将当前位置作为起点}
将当前鼠标位置作为终点位置;
执行绘画函数;
} }
类名:mouseB
作用:用来完成鼠标拖动和鼠标移动时的相应操作
继承的父类:MouseMotionAdapter
class mouseB extends MouseMotionAdapter{
public void mouseDragged(MouseEvent e)
{statusBar.setText(" 鼠标在绘画面板的移动位置:["
+ e.getX() + ", " + e.getY() + "]");
if(currentChoice==3||currentChoice==8)
{ 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();
}
repaint();
}
public void mouseMoved(MouseEvent e)
{statusBar.setText(" 鼠标在绘画面板的位置:["
+ e.getX() + ", " + e.getY() + "]");
}
}
类名:checkBoxHandler
作用:用来完成鼠标拖动和鼠标移动时的相应操作
继承的父类:ItemListener
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;
}
}
- 主要的函数和方法
public static void main(String args[]){
UIManager.setLookAndFeel()//设置当前界面为Windows风格
Huaban newPad=new Huaban();//调用构造函数
windowClosing(WindowEvent e);// WindowAdapter()事件
}
void createNewItem(x){
绘图函数,对currentChoice选择做相应处理,调用
case (x):
new Pencil();//随笔画,初始颜色为黑色,线条为1.0f
new Line();画直线
new Rect();画矩形
new Oval();画椭圆
new Circle(); 画圆
new Rubber(); 橡皮擦
new Word(); 输入文字
new fillRect(); 画填充的矩形,初始填充为黑色
cnew fillOval();画填充的椭圆
new fillCircle();画填充的圆
}
public void chooseColor()//选择颜色,调用选色板
public void setStroke()//改变线条粗细
public void newFile()//新建文件
public void saveFile()//保存文件
public void openFile()//打开一个文件
- 图形编辑系统运行主界面
主函数main()调用Huaban()构造函数,通过构造函数构造主界面,
然后通过事件监听和事件响应函数实现图形编辑系统的功能,该图形编辑系统的主界面图如下:
- 运行调试和分析讨论
用JCreator打开Huaban.java文件,编译处理完成后单击执行,出现程序主界面,执行基本操作,截图如下:
以上是绘制铅笔画,直线,空心矩,椭圆,空心圆,在更多图形里面选择绘制实心的矩形,椭圆和圆,还有通过橡皮擦擦掉圆的一部分和填充的矩形的一部分,后面的是几个字,展现了文字输入,和字体选择,线条粗细的功能,左边的两条直线也展现粗细功能。
以上是基本操作界面,上图将绘画的图片保存为wanglaji 下图是从桌面打开以保存的文件wanglaji.保存的时候不输入文件名的话将无法保存,且保存的文件格式此程序可以识别。
在上图中,打开的文件为空或者是选中的文件不是此系统保存的,则会弹出提示无法打开文件,以上是一些基本操作的界面截图,还有其他功能的操作截图未能一一的列出,例如帮助有两个菜单,一个是“画板开发介绍”,还有一个会弹出作品信息。
改进该系统的想法:
1、可以在常用功能按钮里加上一些常用颜色的选择(红,蓝,绿)。
2、对于常用功能按钮的Icon可以做的更漂亮点(时间原因)
3、可以考虑加上一个“撤消”按钮,撤消绘画的基本图形
4、想过在是用绘图的时候鼠标变成一个钢笔或铅笔的形状,在用橡皮擦的时候变成一个黑圆,是界面更直观。
- 设计体会和小结
通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,特别是对于课外知识的积累也提高了不少,对于图形用户界面的设计从课本的ATW包扩展到SWING包,利用Swing编程设计漂亮的图形用户界面,在设计的过程中我遇到了很多的问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。特别它还让我学会了在网上查阅那些无限的资料,让我明白知识是不能只限于课本,当然更不能只满足于课本。在此次课程设计中主要遇上一下问题
1、在保存源文件时命名与主类不一致
如何解决:将文件名wangwei 改为Huaban
2、原因:在引用用户变量与定义时的不一致,第二个字母大写了。
如何解决:将ButtonHandler 改为ButtonHandler1
3、原因:忘记实现接口ActionListener
如何解决:在类名后加上implements ActionListener
4、原因:java.io.FileNotFoundException
如何解决:加上try…catch对异常进行捕捉
5、原因:java图形界面外观不和谐
如何解决:java的图形界面外观有3种,默认是java的金属外观,还有
就是windows系统,motif系统外观, 用UIManager.setLookAndFeel
( UIManager.getSystemLookAndFeelClassName()) 来设置当前界面为Windows风格。
6、原因:曾出现绘图时图形起点是从(0,0)开始,不能点起点
如何解决:添加鼠标监听,每次操作都记得鼠标起始坐标
- 致谢
在本次Java课程设计中,首先要感谢我的指导老师严丽平老师教将我带如java的知识殿堂,给了我很多的Java的编程知识,编程思想,还有要感谢我的同学,在和他们的讨论中找到许多解决问题的方法,有了你们的帮助本次课程设计得以按时完成
- 参考文献
- 丁振凡.java语言实用教程.北京:北京邮电大学出版社,2004
- 侯捷.Thinking in Java 2e中文版 .北京:清华大学出版社,2003
- 李尊朝.java语言程序设计.北京: 中国铁道出版社,2004.2