java画板课程设计报告.doc

上传人:飞****2 文档编号:56288919 上传时间:2022-11-01 格式:DOC 页数:30 大小:941.50KB
返回 下载 相关 举报
java画板课程设计报告.doc_第1页
第1页 / 共30页
java画板课程设计报告.doc_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《java画板课程设计报告.doc》由会员分享,可在线阅读,更多相关《java画板课程设计报告.doc(30页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、画板一、需求分析平时生活中,我们会需要处理一些基本的图像,也有可能需要花一些简单的图像,平时所使用的图形处理工具有 PhotoShop、Windows 画图工具等,其中PhotoShop 是一款非常强大的图形处理工具,Windows 画图工具则是一款较为简单的画图工具,功能较为简单,用Windows画图工具,是一种比较简单与具有代表性的画图工具,虽然功能不够强大,但具有大多图片处理程序所必需的基本功能:铅笔画图、各种数学函数图形、填色、取色、橡皮擦等等。这次试验中我做的就是一个仿照windows画板的程序。功能: 1.利用graphics 类来向界面上画上相应内容2.能够画出直线,矩形,多边形

2、,椭圆形,圆矩形等3.能够实现橡皮,刷子,喷枪等工具。4.能够实验颜色的设置5.能够保存图片和打开图片(当保存名一致时需提示)6.界面尽量合理,可以仿照windows画板界面。二、概要设计 流程图 画板软件类图1.工具接口Tool:从图中可以看到,工具接口Tool 定义了鼠标动作的四个方法,分别是拖动mouseDrapped()、移动mouseMoved()、松开mouseReleased()、按下mousePressed()、点击mouseClicked()五个动作,并用String 类型的常量属性来定义工具的类型。这个接口只有一个实现类AbstractTool,而每个工具类都是去扩展Abs

3、tractTool 类,在图中表现为Tool1、Tool2.ToolN。2.Tool的实现类AbstractToolAbstractTool 是Tool 的实现类,也是一个抽像类,所以并不能被创建,只能被继承。此类实现Tool中定义的所有方法,并扩展了其它方法,让其子类继承或者重写。该类中为其他的工具类提供了大部分的实现,那么它的子类就可以不必再做重复的实现,只关心与本类相关的逻辑,3.AbstractTool的子类AbstractTool 一共有ArrowTool(箭头)、PencilTool(铅笔)、BrushTool(刷子)、EraserTool(橡皮擦)、LineTool (直线)、R

4、ectTool (矩形)、PolygonTool (多边形)、RoundTool (椭圆形)、RoundRectTool(圆矩形)、AtomizerTool(喷墨)、ColorPickedTool(颜色选择)11 个子类,4. 界面类ImageFrame这个画图工具的界面的主要放在这个类中实现5. 业务逻辑类ImageService除鼠标的画图功能外(画图功能由Tool 的实现类完成),初始化画板、图片的新建打开与保存、各种面板的显示与隐藏、颜色的编辑、整个界面的刷新、菜单等业务逻辑都放在这个类中实现,对象,它并没有保存一些状态属性。6 .文件选择类ImageFileChooserImageF

5、ileChooser 类继承了JFleChooser 类,JFleChooser 是Java 提供的一个简单的文件选择机制,我们这里扩展这个类,是为了增加我们自己的文件过滤器。三、运行环境、开发语言Window xp 和elipseJava语言四、详细设计1 程序清单(二级标题为四号,黑体,三级标题为小四号,黑体)文件名功能ImageAction.java按键处理类ImageFileChooser.java文件选择ImageFrame.java界面显示,布局ImageService.java除界面外的其他功能(文件保存打开等)Main.java主函数MyImage.java创建图片类对象Abs

6、tractTool.java所用工具共同的方法(抽象类)AtomizerTool.java喷枪工具BrushTool.java刷子工具ColorPickedTool.java拾色器EraserTool.java橡皮工具LineTool.java直线工具PencilTool.java铅笔工具PolygonTool.java多边形工具RectTool.java矩形工具RoundRectTool.java圆矩形工具RoundTool.java椭圆形工具Tool.java定义工具类ToolFactory.java 得到某个具体的工具2 主要代码2.1主界面实现:设置JFrame 窗口的标题,接下来初始

7、化画图区域,初始化为白色,然后再获取PENCIL_TOOL(铅笔)类型的Tool,创建各种鼠标监听器,并在监听的执行方法中调用Tool 的相应方法,最后获取左边工具栏面板、下面菜单栏面板、菜单,并把这些面板与画图获取加到JFrame 中,该功能截图如图1。具体代码如下图1 主界面public void init() / 设置标题this.setTitle(未命名 - 画图);/ 初始化画图service.initDrawSpace(this);/ 设置标题获取正在使用的工具tool = ToolFactory.getToolInstance(this, PENCIL_TOOL);/ 创建鼠标运

8、动监听器MouseMotionListener motionListener = new MouseMotionAdapter() public void mouseDragged(MouseEvent e) tool.mouseDragged(e); public void mouseMoved(MouseEvent e) tool.mouseMoved(e);MouseListener mouseListener = new MouseAdapter() / 松开鼠标public void mouseReleased(MouseEvent e) tool.mouseReleased(e);

9、/ 按下鼠标public void mousePressed(MouseEvent e) tool.mousePressed(e);/ 点击鼠标public void mouseClicked(MouseEvent e) tool.mouseClicked(e);/为窗体注册监听器drawSpace.addMouseMotionListener(motionListener);drawSpace.addMouseListener(mouseListener);createMenuBar();/ 以drawSpace为viewport去创建一个JScrollPanescroll = new JS

10、crollPane(drawSpace);/ 设置viewportImageService.setViewport(scroll, drawSpace, bufferedImage.getWidth(),bufferedImage.getHeight();/ 将panel加到本Frame上面this.add(scroll, BorderLayout.CENTER);this.add(toolPanel, BorderLayout.WEST);this.add(colorPanel, BorderLayout.SOUTH);2.2加入菜单把文件、查看、颜色、帮助四个菜单文字放在一个String

11、类型的数组menuArr里面,并迭代这个数组去创建一个JMenu,JMenu 就是指菜单。同样,把他们下面的各个菜单项文字也放在一个String 类型的二维数组里面,去迭代创建每个JmenuItem(菜单项),每创建完一个,就为它加上一个动作监听器,去监听这个菜单项是否被点击。该功能截图如图2。具体代码如下 图2 加入菜单后的界面public void createMenuBar() / 创建一个JMenuBar放置菜单JMenuBar menuBar = new JMenuBar();/ 菜单文字数组,与下面的menuItemArr一一对应String menuArr = 文件(F), 查看

12、(V), 颜色(C), 帮助(H) ;/ 菜单项文字数组String menuItemArr = 新建(N), 打开(O), 保存(S), -, 退出(X) , 工具箱(T), 颜料盒(C) , 编辑颜色 , 帮助主题, 关于 ;/ 遍历menuArr与menuItemArr去创建菜单for (int i = 0; i menuArr.length; i+) / 新建一个JMenu菜单JMenu menu = new JMenu(menuArri);for (int j = 0; j menuItemArri.length; j+) / 如果menuItemArrij等于-if (menuIt

13、emArrij.equals(-) / 设置菜单分隔menu.addSeparator(); else / 新建一个JMenuItem菜单项JMenuItem menuItem = new JMenuItem(menuItemArrij);menuItem.addActionListener(menuListener);/ 把菜单项加到JMenu菜单里面menu.add(menuItem);/ 把菜单加到JMenuBar上menuBar.add(menu);/ 设置JMenubarthis.setJMenuBar(menuBar);2.3创建画图工具栏画图工具栏,这里实现的工具有铅笔、刷子、拾

14、色器、喷枪、橡皮擦、直线、多边形、矩形、椭圆,圆矩形,这里,每个工具我们用一个JButton 去代表它,使用JButton 的JButton(AbstractActoinaction)构造器去创建JButton,用这个构造器创建JButton,可以在AbstractAction 中加入按键的图标,以图形的方式创建按钮,另外,我们会有一个AbstractAction 的实现类。该功能截图如图3。具体代码如下图3 加入画图工具栏public JPanel createToolPanel() / 创建一个JPanelJPanel panel = new JPanel();/ 创建一个标题为工具的工具

15、栏JToolBar toolBar = new JToolBar(工具);/ 设置为垂直排列toolBar.setOrientation(toolBar.VERTICAL);/ 设置为可以拖动toolBar.setFloatable(true);/ 设置与边界的距离toolBar.setMargin(new Insets(2, 2, 2, 2);/ 设置布局方式toolBar.setLayout(new GridLayout(5, 2, 2, 2);/ 工具数组String toolarr = PENCIL_TOOL, BRUSH_TOOL, COLORPICKED_TOOL,ATOMIZER

16、_TOOL, ERASER_TOOL, LINE_TOOL, POLYGON_TOOL, RECT_TOOL,ROUND_TOOL, ROUNDRECT_TOOL ;for (int i = 0; i toolarr.length; i+) ImageAction action = new ImageAction(new ImageIcon(img/+ toolarri + .jpg), toolarri, this);/ 以图标创建一个新的buttonJButton button = new JButton(action);/ 把button加到工具栏中toolBar.add(button)

17、;panel.add(toolBar);/ 返回return panel;2.4 创建颜色选择面板这是一个简单的颜色选择面板,只有最基本的几种颜色选择(BLACK、BLUE、CYAN、GRAY、GREEN、LIGHT_GRAY、MAGENTA、ORANGE、PINK、RED、WHITE、YELLOW),创建过程与创建工具栏的过程类似,用设置了颜色的按钮去代表这些颜色,首先创建一个JToolBar 去放置这些颜色按钮,并设置这个JToolBar 的布局方式、标题、是否可以拖动等属性,最后去遍历保存这些颜色类型的数组,每次都新创建一个ImageAction,并以这个ImageAction 去创建一

18、个JButton,同时设置这个JButton 的颜色,最后加到JToolBar 中该功能截图如图3。具体代码如下图4.加入工具颜色选择面板public JPanel createColorPanel() / 新建一个JPanelJPanel panel = new JPanel();/ 设置布局方式panel.setLayout(new FlowLayout(FlowLayout.LEFT);/ 新建一个JToolBarJToolBar toolBar = new JToolBar(颜色);/ 设置为不可拖动toolBar.setFloatable(false);/ 设置与边界的距离,Inse

19、ts 对象是容器边界的表示形式。toolBar.setMargin(new Insets(2, 2, 2, 2);/ 设置布局方式toolBar.setLayout(new GridLayout(2, 6, 2, 2);/ Color类中的已有颜色Color colorArr = BLACK, BLUE, CYAN, GRAY, GREEN, LIGHT_GRAY,MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW ;JButton panelArr = new JButtoncolorArr.length;/ 正在使用的颜色currentColorPanel

20、= new JPanel();currentColorPanel.setBackground(Color.BLACK);currentColorPanel.setPreferredSize(new Dimension(20, 20);/ 创建这些颜色的buttonfor (int i = 0; i 0 & y 0) / 改变图像大小img = new MyImage(x, y, BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics();g.setColor(Color.WHITE);g.drawImage(getFrame().ge

21、tBufferedImage(), 0, 0,AbstractTool.drawWidth, AbstractTool.drawHeight, null);getFrame().setBufferedImage(img);/ 设置画布的大小AbstractTool.drawWidth = x;AbstractTool.drawHeight = y;/ 设置viewportImageService.setViewport(frame.getScroll(), frame.getDrawSpace(),x, y);private void createShape(MouseEvent e, Gra

22、phics g) / 如果位置在画布内if (getPressX() 0 & getPressY() 0 & e.getX() 0& e.getX() 0& e.getY() AbstractTool.drawWidth - 4 & x AbstractTool.drawHeight - 4& y AbstractTool.drawWidth - 4 & x (int) AbstractTool.drawHeight / 2 - 4& y AbstractTool.drawHeight - 4 & y (int) AbstractTool.drawWidth / 2 - 4& x 0 & e.

23、getX() 0& e.getY() 0 & getPressY() 0) g.setColor(AbstractTool.color);g.drawLine(getPressX(), getPressY(), e.getX(), e.getY();setPressX(e.getX();setPressY(e.getY();getFrame().getDrawSpace().repaint();2.7直线工具、矩形工具、椭圆工具和圆矩形工具这只个类分别代表直线工具、矩形工具、椭圆工具、圆矩形工具,实现的方法很简单,就是调用Grapchis 的drewXXXX 方法(drawLine、drawR

24、ect、drawOval、drawRoundRect),都重写父类的draw(画图形方法)方法,draw 方法最后由createShape 方法调用。该功能截图如图7。具体代码如下 图7. 直线工具、矩形工具、椭圆工具和圆矩形工具画图效果直线工具的实现如下。public void draw(Graphics g, int x1, int y1, int x2, int y2) g.drawLine(x1, y1, x2, y2);矩形工具的实现如下。public void draw(Graphics g, int x1, int y1, int x2, int y2) / 计算起点int x

25、= x2 x1 ? x1 : x2;int y = y2 y1 ? y1 : y2;/ 画矩形g.drawRect(x, y, Math.abs(x1 - x2), Math.abs(y1 - y2);椭圆工具的实现如下。public void draw(Graphics g, int x1, int y1, int x2, int y2) / 计算起点int x = x2 x1 ? x1 : x2;int y = y2 y1 ? y1 : y2;/ 画椭圆g.drawOval(x, y, Math.abs(x1 - x2), Math.abs(y1 - y2);圆矩形工具的实现如下。publ

26、ic void draw(Graphics g, int x1, int y1, int x2, int y2) / 计算起点int x = x2 x1 ? x1 : x2;int y = y2 y1 ? y1 : y2;/ 画圆矩形g.drawRoundRect(x, y, Math.abs(x1 - x2), Math.abs(y1 - y2), 20, 20);2.8多边形工具首先是调用父方法的mouseReleased 去画直线,看粗体位置的代码,如果第一个坐标还没有被赋值,那么说明这是第一次调用此方法(松开鼠标),就把这次点击松开的位置记录为第一个位置。而上一个鼠标位置就记录为当前鼠

27、标位置。最后双击鼠标的时候,就以当前鼠标坐标与第一个坐标(firstX, firstY)画一条直线,再以当前鼠标坐标与最后一个坐标画一条直线(lastX, lastY)该功能截图如图8。具体代码如下图 8 多边形工具效果public void mouseReleased(MouseEvent e) int pressX = getPressX();int pressY = getPressY();/ 调用父方法画直线super.mouseReleased(e);/ 设置第一个与最后一个坐标/第一次调用if (firstX = -1) firstX = pressX;firstY = press

28、Y;lastX = e.getX();lastY = e.getY();/ 点击public void mouseClicked(MouseEvent e) Graphics g = getFrame().getBufferedImage().getGraphics();if (e.getClickCount() = 2 & firstX 0 & e.getX() 0& e.getX() 0& e.getY() 0 ? lastX : getPressX();int y = lastY 0 ? lastY : getPressY();g.drawLine(x, y, x2, y2);2.9刷子

29、与橡皮擦刷子的效果实现:在拖动鼠标的时候,总是以当前鼠标的位置画有颜色填充的矩形,矩形的大小就是刷子的大小。而橡皮擦和刷子的实现是一样的,只不过,刷子用的是其它颜色,而橡皮擦用的是白色。该功能截图如图9.1,9.2具体代码如下 图9.1 刷子画图 图9.2 橡皮擦擦过之后public void mouseDragged(MouseEvent e) super.mouseDragged(e);Graphics g = getFrame().getBufferedImage().getGraphics();int x = 0;int y = 0;/ 画笔大小int size = 4;if (get

30、PressX() 0 & getPressY() 0& e.getX() AbstractTool.drawWidth& e.getY() 0 ? getPressX() : e.getX();y = e.getY() - getPressY() 0 ? getPressY() : e.getY();g.fillRect(x - size, y - size, Math.abs(e.getX() - getPressX()+ size, Math.abs(e.getY() - getPressY() + size);setPressX(e.getX();setPressY(e.getY();g

31、etFrame().getDrawSpace().repaint();2.10 喷枪工具假如喷墨工具要每次产生10 个小点,那么,每次都是产生两个随机数,代表与当前坐标(x, y)的距离(x = new Random().nextInt(size)+ 1; y = new Random().nextInt(size) + 1;),最后当前坐标加上这两个随机数,做为新的坐标去画小矩形。在本章中,喷墨工具对应的是AtomizerTool类,该功能截图如图10具体代码如下 图10. 喷枪效果图public void mouseDragged(MouseEvent e) super.mouseDragged(e);Graphics g = getFrame().getBufferedImage().getGraphics();draw(e, g);/ 画图public void draw(MouseE

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com