JAVA-画图工具全解
java画图Graphics文字自动换行

java画图Graphics⽂字⾃动换⾏/*** ⽂字超出限定长度⾃动换⾏** @param g 画布* @param font 字体样式* @param text ⽂字* @param widthLength 最⼤长度(多少长度后需要换⾏)* @param x ⽂字位置坐标 x* @param y ⽂字位置坐标 Y* @param yn 每次换⾏偏移多少pt*/private void drawString(Graphics2D g, Font font, String text, int widthLength, int x, int y, int yn) {FontMetrics fg = g.getFontMetrics(font);List<String> ls = new ArrayList<>(2);getListText(fg, text, widthLength, ls);for (int i = 0; i < ls.size(); i++) {if (i == 0) {g.drawString(ls.get(i), (int) UnitConv.mm2pt(x), (int) UnitConv.mm2pt(y));} else {g.drawString(ls.get(i), (int) UnitConv.mm2pt(x), (int) UnitConv.mm2pt(y + yn));}}}/*** 递归切割字符串* @param fg* @param text* @param widthLength* @param ls*/private void getListText(FontMetrics fg, String text, int widthLength, List<String> ls) {String ba = text;boolean b = true;int i = 1;while (b) {if (fg.stringWidth(text) > widthLength) {text = text.substring(0, text.length() - 1);i++;} else {b = false;}}if (i != 1) {ls.add(ba.substring(0, ba.length() - i));getListText(fg, ba.substring(ba.length() - i), widthLength, ls);} else {ls.add(text);}}画图中需要填写⽂字,⽽⽂字⼤⼩不固定的时候就会超出画布,显⽰不了⽂字,就需要⾃动换⾏。
Java的Graphics类进行绘图的方法详解

Java的Graphics类进⾏绘图的⽅法详解Graphics类提供基本绘图⽅法,Graphics2D类提供更强⼤的绘图能⼒。
Graphics类提供基本的⼏何图形绘制⽅法,主要有:画线段、画矩形、画圆、画带颜⾊的图形、画椭圆、画圆弧、画多边形等。
1. 画线在窗⼝画⼀条线段,可以使⽤Graphics类的drawLine()⽅法:drawLine(int x1,int y1,int x2,int y2) 例如,以下代码在点(3,3)与点(50,50)之间画线段,在点(100,100)处画⼀个点。
g.drawLine(3,3,50,50);//画⼀条线段g.drawLine(100,100,100,100);//画⼀个点。
2. 画矩形有两种矩形:普通型和圆⾓型。
(1) 画普通矩形有两个⽅法:drawRect(int x,int y,int width,int height):画线框围起来的矩形。
其中参数x和y指定左上⾓的位置,参数width和height是矩形的宽和⾼。
fillRect(int x,int y,int width,int height):是⽤预定的颜⾊填充⼀个矩形,得到⼀个着⾊的矩形块。
以下代码是画矩形的例⼦:g.drawRect(80,100,40,25);//画线框g.setColor(Color.yellow);g.fillRect(20,70,20,30);//画着⾊块(2)画圆⾓矩形也有两个⽅法:drawRoundRect(int x,int y,int width, int height, int arcWidth, int arcHeight):是⽤线围起来的圆⾓矩形。
其中参数x和y指定矩形左上⾓的位置;参数width和heigth是矩形的宽和⾼;arcWidth和arcHeight分别是圆⾓弧的横向直径和圆⾓弧的纵向直径。
fillRoundRect(int x,int y,int width,int height,int arcWidth,int archeight):是⽤预定的颜⾊填充的圆⾓矩形。
java createdrawingpatriarch 使用实例

java createdrawingpatriarch 使用实例Java中的createdrawingpatriarch方法用于创建Sheet的绘图管理器,可以对Sheet进行绘图操作。
绘图管理器中可以添加图形、绘制文本、设置填充颜色等,非常灵活实用。
本文将一步一步回答“java createdrawingpatriarch 使用实例”。
第一步:了解createdrawingpatriarch方法的基本用法在开始实例之前,我们需要了解createdrawingpatriarch方法的基本用法。
该方法是在Workbook接口中定义的,用于在Sheet中创建一个绘图管理器。
绘图管理器可以通过getCreationHelper().createDrawingPatriarch()方法来获取。
接下来的实例中,我们将使用POI库来操作Excel文件,具体使用步骤如下:1. 创建一个Workbook对象:Workbook workbook = new XSSFWorkbook();2. 创建一个Sheet对象:Sheet sheet = workbook.createSheet("Sheet1");3. 获取绘图管理器对象:Drawing drawing = sheet.createDrawingPatriarch();第二步:创建简单的图形下面我们来创建一个简单的图形,以便更好地理解createdrawingpatriarch方法的使用。
我们将创建一个圆形,并设置其位置和大小,代码如下:1. 创建一个绘图对象:XSSFDrawing drawing = (XSSFDrawing)sheet.createDrawingPatriarch();2. 定义圆形的位置和大小:int x = 100; 圆心的横坐标int y = 100; 圆心的纵坐标int width = 100; 圆的宽度int height = 100; 圆的高度3. 绘制圆形:XSSFClientAnchor anchor = drawing.createAnchor(x, y, x + width, y + height, 0, 0, 0, 0);XSSFSimpleShape circle = drawing.createSimpleShape(anchor); circle.setShapeType(ShapeTypes.ELLIPSE);第三步:绘制文本除了图形,我们还可以在Sheet中绘制文本。
java画图api

void setBackgroundPaint(Paint paint) 图示背景色
void setTitle(Stringont(Font font) 图示标题字体
void setBoundingBoxArcWidth(int arcWidth) 图示边界圆角宽
NumberAxis(ValueAxis)类:
void setAutoRangeIncludesZero(boolean flag) 是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag) 是否强制在整个数据轴中包含0,即使0不在数据范围中
void setBoundingBoxArcHeight(int arcHeight) 图示边界圆角高
void setOutlinePaint(Paint paint) 图示边界线条颜色
void setOutlineStroke(Stroke stroke) 图示边界线条笔触
void setDisplaySeriesLines(boolean flag) 图示项是否显示横线(折线图有效)
void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式
void setTickUnit(NumberTickUnit unit) 数据轴的数据标签(需要将AutoTickUnitSelection设false)
DateAxis(ValueAxis)类:
void setFixedDimension(double dimension) (用于复合表中对多坐标轴的设置)
Java图像处理:使用Java 2D API实现图片处理

Java图像处理:使用Java 2D API实现图片处理引言:随着数字摄影技术的发展,我们每天都会拍摄大量的照片。
然而,有时候我们可能需要对这些照片进行一些处理,以使它们更加美观或符合特定的需求。
在本文中,我们将介绍如何使用Java 2D API来实现图片处理,帮助您更好地处理和优化您的图片。
第一部分:Java 2D API简介Java 2D API是Java平台中用于处理图形和图像的强大工具。
它提供了一组丰富的类和方法,使我们能够创建和操作各种图形对象,如线条、矩形、多边形和图像。
Java 2D API还支持图形渲染、颜色管理和图像转换等高级功能。
第二部分:加载和显示图片在开始处理图片之前,我们首先需要加载和显示图片。
Java 2D API提供了Image类来处理图像。
我们可以使用ImageIO类的静态方法read()来从文件中读取图像,并将其保存在一个Image对象中。
然后,我们可以使用Graphics类的drawImage()方法将图像绘制到指定的位置上。
第三部分:图片缩放有时候,我们可能需要调整图片的大小,使其适应特定的显示区域或满足特定的要求。
Java 2D API提供了AffineTransform类来处理图像的变换操作。
我们可以使用AffineTransform类的scale()方法来缩放图像。
通过指定缩放因子,我们可以按比例增加或减小图像的大小。
第四部分:图片旋转除了缩放,有时候我们还需要将图片旋转一定角度。
Java 2D API同样提供了AffineTransform类来实现图像的旋转操作。
我们可以使用AffineTransform类的rotate()方法来指定旋转的角度,并将其应用于图像。
第五部分:图片滤镜效果为了给图片增加一些特殊的效果,Java 2D API提供了一些内置的滤镜类。
我们可以使用这些滤镜类来对图像进行模糊、锐化、亮度调整等操作。
通过创建一个Filter对象,并将其应用于图像,我们可以很容易地实现这些效果。
Java画图工具——Graphics2D

Java画图⼯具——Graphics2D1.使⽤import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.client.j2se.MatrixToImageWriter;import mon.BitMatrix;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import .URL;import java.util.HashMap;import java.util.Map;public class TestGraphics2D {public static void main(String[] args) throws Exception {//从本地读取图⽚String path = "E://tmp/timg.jpg";BufferedImage backImage = ImageIO.read(new File(path));//⽣产画板Graphics2D graphics = backImage.createGraphics();//抗锯齿graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//去⽂字锯齿graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//去图⽚锯齿//⽣成并绘制⼆维码ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();createQR("", pngOutputStream);BufferedImage image = ImageIO.read(new ByteArrayInputStream(pngOutputStream.toByteArray()));graphics.drawImage(image, 50, 50, 100, 100, null);//读取url图⽚并绘制String url = "https:///timg?image&quality=80&size=b9999_10000&sec=1571378016581&di=31ba635c011b8a7179fb19da7f7a2bd3&imgtype=0&src=http%3A%2F%%2Fimage%2Fpf%2Fus%2Fr30%2FPu BufferedImage drawImage = ImageIO.read(new URL(url));graphics.drawImage(drawImage,50,200,100,100, null);//绘制⽂字String ttfPath = "E://tmp/Francis.ttf";Font font = Font.createFont(Font.TRUETYPE_FONT, new File(ttfPath));font = font.deriveFont(Font.PLAIN,34);// Font font = new Font("楷体", Font.BOLD, 34);graphics.setColor(Color.BLACK);graphics.setFont(font);graphics.drawString("Hello World !", 200, 200);//保存图⽚到本地String resultPath = "E://tmp/back.jpg";ImageIO.write(backImage, "PNG", new File(resultPath));}//⽣成⼆维码public static void createQR(String codeContent, OutputStream out) throws Exception {//⼆维码参数Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//设置字符编码类型hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//设置纠错等级L/M/Q/H,纠错等级越⾼越不易识别hints.put(EncodeHintType.MARGIN, 1);//设置⼆维码边距,单位像素,值越⼩⼆维码距离四周越近//⽣成⼆维码,写⼊输出流BitMatrix bitMatrix = new MultiFormatWriter().encode(codeContent, BarcodeFormat.QR_CODE, 150, 150, hints);MatrixToImageWriter.writeToStream(bitMatrix, "PNG", out);}}2.⽂字居中//⽂字居中String outMsg = "This is center !";FontMetrics fontMetrics = graphics.getFontMetrics(font);int textWidth = fontMetrics.stringWidth(outMsg);// ⽂字宽度int centerX = backImage.getWidth() / 2;// 计算出中⼼点 x 位置graphics.drawString(outMsg, centerX - textWidth / 2, 400);3.注意: a.原点统⼀在画板左上⾓,绘制的图⽚和⽂字都位于第四象限。
java xyplot用法

java xyplot用法Java XYPlot是JFreeChart图表库中的一个重要组件,用于创建XY 坐标系图表。
在Java应用程序中,通过使用XYPlot可以实现各种各样的XY坐标系图表,如折线图、散点图、面积图等。
本文将介绍Java XYPlot的基本用法,包括创建XYPlot对象、设置坐标轴、添加数据集等操作。
1. 创建XYPlot对象要使用Java XYPlot,首先需要创建一个XYPlot对象并将其添加到JFreeChart图表中。
以下是创建XYPlot对象的基本代码示例:```javaXYPlot plot = new XYPlot();```2. 设置坐标轴在创建XYPlot对象后,需要设置XY坐标系的坐标轴,包括X轴和Y轴。
可以设置坐标轴的标题、颜色、刻度、刻度标签等属性。
以下是设置X轴和Y轴的示例代码:```javaplot.setDomainAxis(new NumberAxis("X轴"));plot.setRangeAxis(new NumberAxis("Y轴"));```3. 添加数据集在设置坐标轴后,需要向XYPlot中添加数据集,以便在图表中显示数据。
可以通过创建XYSeries对象并向其中添加数据点来实现。
以下是添加数据集的示例代码:```javaXYSeries series = new XYSeries("数据集");series.add(1.0, 1.0);series.add(2.0, 2.0);series.add(3.0, 3.0);XYDataset dataset = new XYSeriesCollection(series);plot.setDataset(dataset);```4. 设置图表样式除了设置坐标轴和添加数据集之外,还可以设置XYPlot的样式,如背景色、边框、线条颜色等。
java画图板课程设计

计算机与信息工程系《JA V A程序设计》课程设计画图板专业计算机班级计000001学号00000姓名0000E-Mail 电话10000000032 时间2000006承德石油高等专科学校摘要:本程序通过调用JA V A提供的BorderLayout,Button,Color;Container;Graphics;Panel;ButtonGroup;JFrame;JPanel;UIManager等基本类进行了简单的界面设计,运用了JA V A中类的继承特性实现了对父类方法的调用,并多次使用CASE语句实现绘图菜单的选择,运用了适配器类简化了监听器类的重写工作。
关键字:UIManager、ActionListener1. 课程设计介绍本程序完成的是一个类似于Windows画图板的绘图程序。
由于不是开发和设计专业的绘图和图像制作软件,所以,完成的程序的简单功能包括以下几项:1.新建一个空白图形文件:用于绘制新的图形。
2.打开或保存一个图形文件,便于对图形文件的管理。
3.绘制一些基本的画图组件:直线、矩形、实心矩形、椭圆、实心椭圆、圆、实心圆、圆角矩形、实心圆角矩形等。
4.可以用鼠标在绘图面板上单击拖动进行随笔画。
5.橡皮擦:可以将已绘制好的图形擦掉。
6.添加文字:可以在绘图区域内添加文字。
7.选择文字的字体:通过一个下拉式的选择条,可以选中所需要的字体。
本程序中包括:宋体、隶书、华文彩云、仿宋_GB2312、华文行楷、方正舒体、Times New Roman、Serif、Monospaced、SonsSerif、Garamond。
当然,在下面的的程序分析中可以看到,由于我们灵活设置了字体数组,是的可以随意添加系统支持的任何字体。
大大方便和简化了程序设计。
8.选择文字的字体风格:通过两个复选框按钮,可以选择需要的字体风格,包括:粗体、斜体,使用者有三种选择方式,包括:①同时选中两者、②只选择其中一种、③两者都不选中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
JAVA是一门很优秀的编程语言,具有面向对象、与平台无关、安全、稳定和多线程等特点,是目前软件设计中极为健壮的编程语言。
JAVA不仅可以用来开发大型的应用程序。
而且特别适合Internet的应用开发。
JAVA确实具备“一次写成,处处运行”的特点,JAVA以成为网络时代最重要的编程语言之一。
本报告中介绍了用JAVA语言实现画笔系统的全部过程。
本次课程设计是配合JAVA程序设计课程,帮助我们深入学习掌握JAVA语言,熟练运用这个工具来编写的。
通过课程设计各个项目的综合训练,培养学生实际分析问题、编程和动手能力、提高学生的综合素质。
本课程设计尝试使用一些较生动的示例和设计项目,激发学生学习兴趣,引导学生主动学习,正确理解、接受需要重点掌握的知识点,为参加项目开发及更深入学习做好准备。
本次课程设计主要是用JAVA实现画笔系统,其系统主要完成以下功能:设计一个画图程序,能够实现画笔、画直线、画圆形、画矩形、修改该画笔的大小以及颜色。
该画图程序还需具有橡皮擦功能以及清空整个画面的功能关键词:画图工具,JA V A目录摘要 (1)目录 (2)1.绪论 (3)2. 开发环境介绍 (4)3.需求分析 (5)3.1总体目标..................................... 错误!未定义书签。
3.2要实现的功能 (7)4.概要设计 (8)4.1设计准备 (8)4.2需要用到的类 (8)5.详细设计 (9)5.5类的设计 (9)5.2类的方法设计 (9)6.测试数据及运行结果 (8)7.总结 (15)8.参考文献 (15)9.源程序 (15)1.绪论Java不依赖平台的特点使它受到广泛的关注,Java已成为网络时代最重要的语言之一。
目前,Java语言不仅是一门被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。
因为很多新的技术领域都涉及到Java语言,国内外许多大学已将Java语言列入本科教学计划,而IT行业对Java人才的需求也在不断的增长,因此,掌握Java 已经成为共识。
Java是一门说简单也不简单,说难也不难的课程。
所以,我们在学习的过程中要根据自己的具体情况,合理安排编程训练时间,相信编程能力会在不知不觉中得到提高。
在此次的课程设计实践中,我学到了教科书上没有的东西。
这次课程设计,我按照课程设计的要求,分块实现程序的功能。
在实践中我遇到许多的问题,但我都克服,最终我成功的完成了这次课程设计。
从中我充分理解了Java面对对象的特性,并体会到Java与C语言的不同之处在实践的同时,我又从中成长了许多,特别是在对程序的编译和调试中掌握了许多的技巧和方法,为今后的其他计算机语言的学习奠定了一定的基础2. 开发环境介绍该项目所使用的软件开发环境如下:操作系统:Windows xp开发工具:eclipse3.2及其VE插件Eclipse简介Eclipse 是一个开放源代码的、基于Java 的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse 附带了一个标准的插件集,包括Java 开发工具。
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集大成者,使用者只需下载各种语言的插件即可。
3.需求分析3.1要实现的功能(1)完成画线、画直线、画矩形、画圆及擦除(橡皮擦功能)(2)可以设置画笔颜色(3)可以设置画笔宽度(4)使用面向对象的方法4.1设计准备1、此程序为实现这些功能模块,必须首先定义一个工具面板,将这些画笔、画箭头、椭圆、圆、多边形直线、画矩形、画笔颜色、画笔大小、橡皮等功能组件放入这个工具面板中。
2、此程序为实现利用鼠标做画笔的功能,必会产生鼠标事件MouseEvent。
因此,为实现鼠标画图的功能,必须用到鼠标触发事件,故在此程序中,必须实现“委托事件模型”,用到事件源、事件对象以及监听者对象。
3、此程序中,必须用到的包如下:import java.awt.*;import javax.swing.*;import java.awt.event.*;4.2需用到的类1 )class Mycanvas此类用于定义一组数据成员,并且使用构造函数将他们分别初使化,以方便在下面的程序中使用他们。
2)class Myframe此类用于实现这个程序的大部分功能,在这个类中除了定义一些基本变量以及构造函数外,还定义了很多成员方法,这些成员方法将实现鼠标触发事件的一系列绘图功能。
3 )public class Text这个类是主类,是程序得以运行的入口。
在这个主类中定义了主方法,是该程序执行的入口。
5.1类的设计1) class Mycanvas在这个类中定义了用于截断的一系列标志变量,有初始坐标、颜色、工具选择等,并且在这个类中还定义了构造函数void setx1(int x1){ },用于完成对这些变量的初始化工作。
2) class Myframe这个类用来实现整个程序的大部分功能,并且在这个类中定义了大部分的成员函数和成员方法,在这个类中用到的主要成员方法如下:public void actionPerformed(ActionEvent e){}public void itemStateChanged(ItemEvent e){}public void mousePressed(MouseEvent e){}public void mouseRelesed(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){}public void mouseDragged(MouseEvent e){}public void mouseMoved(MouseEvent e){}5.2类的方法介绍①定义的变量:在这个类中,首先定义了画笔的大小、画笔的颜色、画笔的粗细、橡皮的大小、工具的选择等一些变量,并且还用到了系统中自带的一些类初使化了一些面板工具对象,用于完成对面板工具、画直线、画椭圆、画矩形、橡皮擦、清除等一些工具按钮的定义。
②初使化构造函数:在这个初使化构造函数中,首先继承了父类Frame,然后初使化了各工具按钮以及各个选择项,包括颜色选择、画笔大小选择、橡皮大小选择,并且将这些组件添加到了工具面板中,最后还对各个组件注册了事件监听者对象。
③paint()方法:这个方法主要用于在Applet的界面中显示文字、图形和其它界面元素。
本程序中,在这个方法中,定义了一些工具选项设置,给用户选择画笔、画直线、画圆、橡皮擦等一些功能。
④itemStateChanged()方法:这个方法用来实现的功能很简单,主要是用来改变画笔大小、画笔颜色、橡皮大小的。
在此方法中,设置了大小以及颜色的一些预选项,以供用户对大小以及颜色做出选择。
⑤mouseDragged()方法:此方法是处理MouseEvent事件以实现MouseMotionListener接口的对象。
MouseMotionListener是事件监听者,mouseDragged(MouseEvent e)是成员方法,代表鼠标拖动事件,在这个方法中,还用到了MouseEvent类常用成员方法:public int getX()以及public int getY(),用来返回发生鼠标事件的X及Y的坐标。
这个方法中,主要用来控件画笔和橡皮的转换。
⑥mousePressed()方法:此方法是处理MouseEvent事件以实现MouseListener接口的对象。
MouseListener是事件监听者,mouseDPressed(MouseEvent e)是成员方法,代表鼠标按下事件。
这个方法主要用来控件用户画直线、画圆、画矩形这些功能之间的转换。
⑦ mouseReleased()方法:mouseEntered()方法:mouseExited()方法:mouseClicked()方法:这些方法和mousePressed()方法属于同一类,他主要用来表示鼠标释放事件,是对上述各个功能完成后对鼠标事件的又一次触发。
3、画直线、画圆、画矩形7.总结此软件基本达到理想效果,在编写这一软件的过程中我学到了很多java 编程知识,并学会了如何快速的改正程序中的错误。
在本次java课程设计中,我收获了很多。
特别是在编写java程序时,必须先对程序的功能进行初步的分析,得到程序中每一个功能所需要用到的方法或思路,同时根据功能的相似来设计一类功能的实现,并通过某些语句的改变达到多功能效果。
这次课程设计使我受益匪浅,锻炼了我做事坚持不懈的心态,也使我的自学能力也有了一定的提高,我更明白了搞计算机这行,要学到真正的技术完全要靠自己,在课堂上只能学到最基本的东西,但这最基本的东西也一定要学好。
8.参考文献《java2实用教程》耿祥于、张跃平编著清华大学出版社9.源程序package sdrc;import java.awt.*;import java.awt.event.*;import javax.swing.*;class Mycanvas extends Canvas {int x1,y1,x2,y2,x3,y3,r;int d=3;int huabi=1;double x[]=new double[8],y[]=new double[8];int x4[]=new int[8],y4[]=new int[8];Double X[]=new Double[8],Y[]=new Double[8];Color c;Mycanvas(){setBackground(Color.white);}void setx1(int x1){this.x1=x1;}void sety1(int y1){this.y1=y1;}void setx2(int x2){this.x2=x2;}void sety2(int y2){this.y2=y2;}void setx3(int x3){this.x3=x3;}void sety3(int y3){this.y3=y3;}void setcolor(Color c){this.c=c;}void setarc(int d){this.d=d;}void setr(int e){r=e;}void sethuabi(int huabi){this.huabi=huabi;}public void paint(Graphics g,int i){g.setColor(c);Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);if(i==1){g.drawOval(x1, y1, x2,y2);}else if(i==2){g.drawLine(x1, y1, x2, y2);}else if(i==3){g.drawRect(x1, y1, x2,y2);}}public void Paint(Graphics g){Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);for(int i=0;i<d;i++){X[i]=new Double(x[i]);x4[i]=X[i].intValue();Y[i]=new Double(y[i]);y4[i]=Y[i].intValue();}for(int i=0;i<d;i++){g.drawLine(x4[i%d],y4[i%d],x4[(i+1)%d],y4[(i+1)%d]);}}public void paintk(Graphics g) {g.setColor(c);Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);double H = 10 ;double L = 7 ;int x3 = 0 ;int y3 = 0 ;int x4 = 0 ;int y4 = 0 ;double awrad = Math.atan(L / H);double arraow_len = Math.sqrt(L * L + H * H);double [] arrXY_1 = rotateVec(x2 - x1, y2 - y1, awrad, true , arraow_len);double[] arrXY_2 = rotateVec(x2- x1, y2- y1, - awrad, true, arraow_len);double x_3 = x2 - arrXY_1[ 0 ]; // (x3,y3)是第一端点double y_3 = y2 - arrXY_1[ 1 ];double x_4 = x2 - arrXY_2[ 0 ]; // (x4,y4)是第二端点double y_4 = y2 - arrXY_2[ 1 ];Double X3 = new Double(x_3);x3 = X3.intValue();Double Y3 = new Double(y_3);y3 = Y3.intValue();Double X4 = new Double(x_4);x4 = X4.intValue();Double Y4 = new Double(y_4);y4 = Y4.intValue();// g.setColor(SWT.COLOR_WHITE);// 画线g.drawLine(x1, y1, x2, y2);g.drawLine(x2, y2, x3, y3);g.drawLine(x2,y2,x4,y4);}public double [] rotateVec( int px, int py, double ang, boolean isChLen, double newLen) {double mathstr[] = new double [ 2 ];double vx = px * Math.cos(ang) - py * Math.sin(ang);double vy = px * Math.sin(ang) + py * Math.cos(ang);if (isChLen) {double d = Math.sqrt(vx * vx + vy * vy);vx = vx / d * newLen;vy = vy / d * newLen;mathstr[ 0 ] = vx;mathstr[ 1 ] = vy;}return mathstr;}}class Myframe extends Frame implements ActionListener,ItemListener,MouseListener, MouseMotionListener {Mycanvas canvas;Graphics g;int x, y, z, r;int p, q;int flag=0;int xiangpi=4;int huabi=1;Panel panel1, panel2, panel3;Label label1, label2, label3,label5,label6;Button b1, b2, b3, b4,b6,b7,b8,b9;TextField t1, t2, t3, t4,t5,t6,t7;Box baseBox, box1, box2, box3;Choice choice,choice2,choice3;Myframe() {super("画图工具");canvas = new Mycanvas();choice = new Choice();choice2 = new Choice();choice3 = new Choice();label1 = new Label("操作");label2 = new Label("参数");label3 = new Label("颜色");label5=new Label("橡皮擦"); label6=new Label("画笔"); panel1 = new Panel();panel2 = new Panel();panel3 = new Panel();b1 = new Button("圆");b2 = new Button("椭圆");b3 = new Button("直线");b4 = new Button("矩形");b6 = new Button("清除");b7= new Button("退出");b8=new Button("橡皮擦");b9=new Button("绘画");t1 = new TextField(5);t2 = new TextField(5);t3 = new TextField(5);t4 = new TextField(5); choice.add("红");choice.add("绿");choice.add("蓝");choice.add("黄");choice.add("青");choice.add("橙");choice.add("黑");choice2.add("4");choice2.add("10");choice2.add("20");choice2.add("50");choice2.add("100");choice2.add("200");choice3.add("1");choice3.add("3");choice3.add("8");choice3.add("10");choice3.add("13");choice3.add("16");b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); b6.addActionListener(this); b7.addActionListener(this); b8.addActionListener(this); b9.addActionListener(this);choice.addItemListener(this);choice2.addItemListener(this);choice3.addItemListener(this);box1 = Box.createHorizontalBox();box1.add(label1);box1.add(Box.createHorizontalStrut(4)); box1.add(b1);box1.add(Box.createHorizontalStrut(8)); box1.add(b2);box1.add(Box.createHorizontalStrut(8)); box1.add(b3);box1.add(Box.createHorizontalStrut(8)); box1.add(b4);box2 = Box.createHorizontalBox();box2.add(label2);box2.add(Box.createHorizontalStrut(8)); box2.add(t1);box2.add(Box.createHorizontalStrut(5)); box2.add(t2);box2.add(Box.createHorizontalStrut(5)); box2.add(t3);box2.add(Box.createHorizontalStrut(5)); box2.add(t4);box3 = Box.createHorizontalBox();box3.add(label3);box3.add(Box.createHorizontalStrut(5)); box3.add(choice);box3.add(Box.createHorizontalStrut(5)); box3.add(label5);box3.add(Box.createHorizontalStrut(5)); box3.add(choice2);box3.add(Box.createHorizontalStrut(5)); box3.add(label6);box3.add(Box.createHorizontalStrut(5)); box3.add(choice3);baseBox = Box.createVerticalBox(); baseBox.add(box1);baseBox.add(Box.createVerticalStrut(5)); baseBox.add(box2);baseBox.add(Box.createVerticalStrut(5)); baseBox.add(box3);panel1.add(baseBox);panel1.setBackground(Color.gray);panel3.add(panel1, BorderLayout.WEST);panel2.add(b6);panel2.add(b7);panel2.add(b8);panel2.add(b9);panel2.setBackground(Color.gray);panel3.add(panel2, BorderLayout.EAST);add(panel3, BorderLayout.NORTH);add(canvas, BorderLayout.CENTER);canvas.addMouseListener(this);canvas.addMouseMotionListener(this);setBackground(Color.darkGray);setBounds(100, 100, 200, 200);setVisible(true);validate();}public void actionPerformed(ActionEvent e) { int a,b,c;g = canvas.getGraphics();if (e.getSource() == b7) {System.exit(0);}else if (e.getSource() == b6) {canvas.update(g);}else if(e.getSource()==b8){flag=1;}else if(e.getSource()==b9){flag=0;}x = Integer.parseInt(t1.getText());y = Integer.parseInt(t2.getText());z = Integer.parseInt(t3.getText());r = Integer.parseInt(t4.getText());canvas.setx1(x);canvas.sety1(y);canvas.setx2(z);canvas.sety2(r);if (e.getSource() == b1 || e.getSource() == b2) { canvas.paint(g, 1);} else if (e.getSource() == b3) {canvas.paint(g, 2);} else if (e.getSource() == b4) {canvas.paint(g, 3);}}public void itemStateChanged(ItemEvent e) { if(e.getSource()==choice){if (choice.getSelectedIndex() == 0)canvas.setcolor(Color.red);if (choice.getSelectedIndex() == 1)canvas.setcolor(Color.green);if (choice.getSelectedIndex() == 2)canvas.setcolor(Color.blue);if (choice.getSelectedIndex() == 3)canvas.setcolor(Color.yellow);if (choice.getSelectedIndex() == 4)canvas.setcolor(Color.cyan);if (choice.getSelectedIndex() == 5)canvas.setcolor(Color.orange);if (choice.getSelectedIndex() == 6)canvas.setcolor(Color.black);}else if(e.getSource()==choice2){if(choice2.getSelectedIndex() == 0){ xiangpi=4;}if(choice2.getSelectedIndex() == 1){ xiangpi=10;}if(choice2.getSelectedIndex() == 2){ xiangpi=20;}if(choice2.getSelectedIndex() == 3){ xiangpi=50;}if(choice2.getSelectedIndex() == 4){ xiangpi=100;}if(choice2.getSelectedIndex() == 5){ xiangpi=200;}}else if(e.getSource()==choice3){if(choice3.getSelectedIndex() == 0){ huabi=1;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 1){ huabi=3;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 2){ huabi=8;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 3){ huabi=10;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 4){ huabi=13;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 5){ huabi=16;canvas.sethuabi(huabi);}}}public void mousePressed(MouseEvent e) {p = e.getX();q = e.getY();}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {}public void mouseDragged(MouseEvent e) {g = canvas.getGraphics();Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);z = e.getX();r = e.getY();canvas.setx1(p);canvas.sety1(q);canvas.setx2(z);canvas.sety2(r);if(flag==0)canvas.paint(g, 2);else if(flag==1){g.setColor(Color.white);g.fillOval(p-xiangpi/2, q-xiangpi/2, xiangpi, xiangpi);}p = z;q = r;}public void mouseMoved(MouseEvent e) {}}public class Text {public static void main(String[] args) {Myframe a=new Myframe();a.addWindowListener(new java.awt.event.WindowAdapter(){ public void windowClosing(java.awt.event.WindowEvent e){ System.exit(0);}});}}。