JAVA-画图工具全解
- 格式:doc
- 大小:149.50 KB
- 文档页数:19
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类进⾏绘图的⽅法详解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方法用于创建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图像处理:使用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画图⼯具——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是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的样式,如背景色、边框、线条颜色等。
计算机与信息工程系《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.选择文字的字体风格:通过两个复选框按钮,可以选择需要的字体风格,包括:粗体、斜体,使用者有三种选择方式,包括:①同时选中两者、②只选择其中一种、③两者都不选中。
java-callgraph2使用方法的具体使用全文共四篇示例,供读者参考第一篇示例:Java-callgraph2是一个用于生成Java应用程序调用关系图的工具,它可以帮助开发者更好地理解代码之间的调用关系,帮助定位问题和优化代码。
在本文中,我们将介绍Java-callgraph2的使用方法,以帮助读者更好地了解如何使用这个工具。
我们需要下载和安装Java-callgraph2。
可以在其官方网站上找到最新版本的下载链接,并按照指南进行安装。
安装完成后,我们可以开始生成调用关系图。
生成调用关系图的第一步是配置项目的类路径。
我们需要告诉Java-callgraph2项目的依赖关系,以便正确地解析代码之间的调用关系。
通过在配置文件中指定项目的classpath,我们可以确保生成准确的关系图。
接下来,我们需要指定要分析的入口点。
入口点是我们希望从哪里开始分析代码的位置。
可以是一个主类,也可以是一些特定的方法。
通过在配置文件中指定入口点,我们可以控制分析的范围。
我们还需要指定生成的结果的输出路径。
生成的调用关系图可以以多种格式输出,比如文本文件、图形化展示等。
通过指定输出路径,我们可以保存生成的结果以备查阅和分享。
在配置完成后,我们可以运行Java-callgraph2来生成调用关系图。
通过命令行或者IDE插件等方式,我们可以启动分析过程。
在分析完成后,我们可以在指定的输出路径中找到生成的调用关系图。
我们可以使用生成的调用关系图来帮助我们理解代码结构和调用关系。
通过查看不同方法之间的调用关系,我们可以更好地了解代码的执行流程和依赖关系。
这有助于我们快速定位问题并进行代码优化。
Java-callgraph2是一个非常实用的工具,可以帮助我们更好地理解代码之间的调用关系,提高代码质量和效率。
希望通过本文的介绍,读者能够更加熟练地使用Java-callgraph2,并在日常开发中更好地利用这个工具。
第二篇示例:Java-callgraph2是一个用于生成Java应用程序调用图的工具,可以帮助开发人员更好地理解和分析Java应用程序的调用关系。
graphics类的drawimage方法Graphics类是Java编程语言中用于绘制图形的一个重要类。
其中,drawImage方法是Graphics类中的一个用于绘制图像的方法。
本文将以drawImage方法为主题,详细介绍该方法的使用和一步一步的操作过程。
一、Graphics类和drawImage方法的概述在Java中,Graphics类是一个抽象类,它提供了一系列绘制图形和图像的方法。
Graphics类的对象可以通过GUI组件的getGraphics()方法来获得,通过该对象可以在组件上进行绘图操作。
而drawImage方法则是其中的一个重要的方法,用于在指定位置绘制图像。
二、drawImage方法的语法和参数drawImage方法的语法如下:void drawImage(Image img, int x, int y, ImageObserver observer)其中,参数说明如下:- img:要绘制的图像对象。
- x:图像的横坐标。
- y:图像的纵坐标。
- observer:图像观察者,用于在图像加载完成后通知应用程序。
三、使用drawImage方法绘制图像的步骤接下来,我们将一步一步地介绍使用drawImage方法绘制图像的步骤。
步骤1:创建一个用于绘图的组件首先,我们需要创建一个Swing或AWT组件,用于绘制图像。
可以是JPanel、JFrame等。
javaimport javax.swing.*;创建一个JPanel,用于绘制图像JPanel panel = new JPanel();步骤2:获取绘图对象其次,我们需要通过该组件的getGraphics()方法获取一个Graphics对象,用于进行绘图操作。
javaGraphics g = panel.getGraphics();步骤3:加载图像文件然后,我们需要加载一个图像文件,可以使用ImageIO类的read()方法来实现。
Java实现画图的详细步骤(完整代码)⼀、导⼊依赖<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.13</version></dependency>⼆、⼯具类package com.geidco.dcp.util;import net.coobird.thumbnailator.Thumbnails;import net.coobird.thumbnailator.filters.ImageFilter;import net.coobird.thumbnailator.geometry.Coordinate;import ng3.StringUtils;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import java.math.BigDecimal;import java.util.ArrayList;import java.util.Arrays;import java.util.Base64;import java.util.List;/*** @author XuPengFei*/public class ImageUtil {public static BufferedImage watermarkImgBase64(String base64, List<ImageWatermark> images, List<ImageFontText> texts) throws Exception {InputStream inputStream = null;base64 = base64.replaceFirst("data:image\\/.*;base64,", "");Base64.Decoder decoder = Base64.getDecoder();try {byte[] bytes = decoder.decode(base64);ByteArrayInputStream bais = new ByteArrayInputStream(bytes);inputStream = bais;} catch (Exception e) {e.printStackTrace();}BufferedImage destImage = ImageIO.read(inputStream);BufferedImage tempImage = null;int w1 = destImage.getWidth(), h1 = destImage.getHeight(), startX, startY, endX, endY;System.out.println("w1" + w1);System.out.println("h1" + h1);//⽔印位置Coordinate coordinate = null;//⽔印位置坐标左上、右下List<Integer> points = null;for (ImageWatermark imageWatermark : images) {inputStream = getInputStream(imageWatermark.getImageUrl());if (null == inputStream) {continue;}points = imageWatermark.getPoints();startX = new BigDecimal(points.get(0)).intValue();startY = new BigDecimal(points.get(1)).intValue();endX = new BigDecimal(points.get(2)).intValue();endY = new BigDecimal(points.get(3)).intValue();//设置⽔印位置coordinate = new Coordinate(startX, startY);tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(endX - startX, endY - startY).keepAspectRatio(false).asBufferedImage();// tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(180,180).keepAspectRatio(false).asBufferedImage();// destImage = Thumbnails.of(destImage).size(w1,h1).watermark(coordinate,tempImage,1f).asBufferedImage();destImage = Thumbnails.of(destImage).size(w1, h1).watermark(coordinate, tempImage, 1f).asBufferedImage();}for (ImageFontText fontText : texts) {startX = new BigDecimal(fontText.getStartX()).intValue();startY = new BigDecimal(fontText.getStartY()).intValue();destImage = mergeFontText(destImage, fontText, startX, startY);}destImage = Thumbnails.of(destImage).addFilter(new ThumbnailsImgFilter()).size(w1, h1).asBufferedImage();return destImage;}public static BufferedImage watermarkImg(String baseImgUrl, List<ImageWatermark> images, List<ImageFontText> texts) throws Exception {InputStream inputStream = getInputStream(baseImgUrl);if (null == inputStream) {throw new RuntimeException("海报图⽚⽣成失败");}BufferedImage destImage = ImageIO.read(inputStream);BufferedImage tempImage = null;int w1 = destImage.getWidth(), h1 = destImage.getHeight(), startX, startY, endX, endY;System.out.println("w1" + w1);System.out.println("h1" + h1);//⽔印位置Coordinate coordinate = null;//⽔印位置坐标左上、右下List<Integer> points = null;for (ImageWatermark imageWatermark : images) {inputStream = getInputStream(imageWatermark.getImageUrl());if (null == inputStream) {continue;}points = imageWatermark.getPoints();startX = new BigDecimal(points.get(0)).intValue();startY = new BigDecimal(points.get(1)).intValue();endX = new BigDecimal(points.get(2)).intValue();endY = new BigDecimal(points.get(3)).intValue();//设置⽔印位置coordinate = new Coordinate(startX, startY);tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(endX - startX, endY - startY).keepAspectRatio(false).asBufferedImage();// tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(180,180).keepAspectRatio(false).asBufferedImage();// destImage = Thumbnails.of(destImage).size(w1,h1).watermark(coordinate,tempImage,1f).asBufferedImage();destImage = Thumbnails.of(destImage).addFilter(new ThumbnailsImgFilter()).size(w1, h1).watermark(coordinate, tempImage, 1f).asBufferedImage(); }for (ImageFontText fontText : texts) {startX = new BigDecimal(fontText.getStartX()).intValue();startY = new BigDecimal(fontText.getStartY()).intValue();destImage = mergeFontText(destImage, fontText, startX, startY);}return destImage;}private static BufferedImage mergeFontText(BufferedImage bufferedImage, ImageFontText fontText,int left, int top) throws Exception {Graphics2D g = bufferedImage.createGraphics();g.setColor(getColor(fontText.getTextColor()));Font font = new Font(fontText.getTextFont(), Font.BOLD, fontText.getTextSize());g.setFont(font);g.setBackground(Color.white);if (fontText.getStartX() == -1) {//昵称居中设置FontMetrics fmNick = g.getFontMetrics(font);int nickWidth = fmNick.stringWidth(fontText.getText());int nickWidthX = (bufferedImage.getWidth() - nickWidth) / 2;//绘制⽂字g.drawString(new String(fontText.getText().getBytes(), "utf-8"), nickWidthX, top);} else {g.drawString(new String(fontText.getText().getBytes(), "utf-8"), left, top);}g.dispose();return bufferedImage;// AttributedString ats = new AttributedString("我是\n⼩⾬哈哈哈");// ats.addAttribute(TextAttribute.FOREGROUND, f, 0,2 );// AttributedCharacterIterator iter = ats.getIterator();// g.drawString(iter,left,top);}private static Color getColor(String color) {if (StringUtils.isBlank(color) || color.length() < 7) {return null;}try {int r = Integer.parseInt(color.substring(1, 3), 16);int g = Integer.parseInt(color.substring(3, 5), 16);int b = Integer.parseInt(color.substring(5), 16);return new Color(r, g, b);} catch (NumberFormatException nfe) {return null;}}public static InputStream getInputStream(String baseUrl) {if (StringUtils.isBlank(baseUrl)) {return null;}try {InputStream inputStream = new FileInputStream(baseUrl);return inputStream;} catch (IOException e) {e.printStackTrace();}// try {// URL url = new URL(baseUrl);// HttpURLConnection connection = (HttpURLConnection) url.openConnection();// connection.setConnectTimeout(6000);// connection.setReadTimeout(6000);// int code = connection.getResponseCode();// if (HttpURLConnection.HTTP_OK == code) {// return connection.getInputStream();// }// } catch (Exception e) {// e.printStackTrace();// }return null;}/*** 将透明背景设置为⽩⾊*/public static class ThumbnailsImgFilter implements ImageFilter {@Overridepublic BufferedImage apply(BufferedImage img) {int w = img.getWidth();int h = img.getHeight();BufferedImage newImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);Graphics2D graphic = newImage.createGraphics();graphic.setColor(Color.white);//背景设置为⽩⾊graphic.fillRect(0, 0, w, h);graphic.drawRenderedImage(img, null);graphic.dispose();return newImage;}}}三、⼯具类package com.geidco.dcp.util;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/*** @author XuPengFei*/@Data@NoArgsConstructor@AllArgsConstructorpublic class ImageFontText {private String text;private Integer textSize = 50;private String textColor = "#ff0000";private String textFont = "宋体";private Integer startX;private Integer startY;}四、⼯具类package com.geidco.dcp.util;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.List;/*** @author XuPengFei*/@Data@NoArgsConstructor@AllArgsConstructorpublic class ImageWatermark {/*** 图⽚地址*/private String imageUrl;/*** ⽔印图⽚左上、右下标*/private List<Integer> points;}五、测试接⼝package com.geidco.dcp.controller.meetingApply;import com.geidco.dcp.pojo.meetingApply.MeetingApply;import com.geidco.dcp.pojo.meetingApply.MeetingGuestCardTemplate;import com.geidco.dcp.service.meetingApply.MeetingApplyService;import com.geidco.dcp.service.meetingApply.MeetingGuestCardTemplateService; import com.geidco.dcp.util.*;import mon.annotation.Log;import ng.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.util.ResourceUtils;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletResponse;import java.awt.image.BufferedImage;import java.io.*;import java.text.SimpleDateFormat;import java.util.*;@RestController@RequestMapping("/meetingGuestCard")public class MeetingGuestCardController {@Value("${config.ldir}")String ldir;@Value("${config.wdir}")String wdir;@Autowiredprivate MeetingApplyService meetingApplyService;@Autowiredprivate IdWorker idWorker;private MeetingGuestCardTemplateService meetingGuestCardTemplateService;@PostMapping("/generateGuestCard")@Log("绘制电⼦嘉宾证")public void generateGuestCard(@RequestBody Map<String, String> formData, HttpServletResponse response) {String templateId = formData.get("templateId");String ids = formData.get("meetingApplyId");List<String> meetingApplyIds = Arrays.asList(ids.split(","));List<MeetingApply> meetingApplys = meetingApplyService.getByKeys(meetingApplyIds);String uuid = UUID.randomUUID().toString().replaceAll("-", "");String datePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/" + uuid + "/";String zipPath = SysMeetingUtil.getAnnexFilePath() + "generateGuestCard/" + datePath;File file = new File(zipPath);if (!file.exists()) {file.mkdirs();}// 上传的位置String path = System.getProperty("").toLowerCase().indexOf("win") >= 0 ? wdir : ldir;MeetingGuestCardTemplate cardTemplate = meetingGuestCardTemplateService.findById(templateId);// 底图String baseImgUrl = cardTemplate.getBaseMapUrl();try {for (int i = 0; i < meetingApplys.size(); i++) {MeetingApply meetingApply = meetingApplys.get(i);String name = null;String unitName = null;String postName = null;String photoUrl = path;if ("zh".equals(meetingApply.getApplyWay())) {name = meetingApply.getName();unitName = meetingApply.getUnitName();postName = meetingApply.getPositionName();photoUrl = photoUrl + meetingApply.getPhotoUrl();} else {name = meetingApply.getNameEn();unitName = meetingApply.getUnitNameEn();postName = meetingApply.getPositionNameEn();photoUrl = photoUrl + meetingApply.getPhotoUrl();}List<ImageWatermark> images = new ArrayList<>();List<ImageFontText> texts = new ArrayList<>();// 查询模板详情List<MeetingGuestCardTemplate> templates = meetingGuestCardTemplateService.findByTemplateId(templateId);for (MeetingGuestCardTemplate template : templates) {String dict = template.getElementTypeDict();if ("1".equals(dict)) {ImageFontText imageFontText = new ImageFontText(name, StringUtils.isNotBlank(template.getFontSize()) ? Integer.parseInt(template.getFontSize()) : 30,StringUtils.isNotBlank(template.getFontColor()) ? template.getFontColor() : "#333333",StringUtils.isNotBlank(template.getFontType()) ? template.getFontType() : "宋体",template.getStartX(), template.getStartY());texts.add(imageFontText);}if ("2".equals(dict)) {ImageFontText imageFontText = new ImageFontText(unitName, StringUtils.isNotBlank(template.getFontSize()) ? Integer.parseInt(template.getFontSize()) : 30, StringUtils.isNotBlank(template.getFontColor()) ? template.getFontColor() : "#333333",StringUtils.isNotBlank(template.getFontType()) ? template.getFontType() : "宋体",template.getStartX(), template.getStartY());texts.add(imageFontText);}if ("3".equals(dict)) {ImageFontText imageFontText = new ImageFontText(postName, StringUtils.isNotBlank(template.getFontSize()) ? Integer.parseInt(template.getFontSize()) : 30, StringUtils.isNotBlank(template.getFontColor()) ? template.getFontColor() : "#333333",StringUtils.isNotBlank(template.getFontType()) ? template.getFontType() : "宋体",template.getStartX(), template.getStartY());texts.add(imageFontText);}if ("100".equals(dict)) {Integer startX = template.getStartX();Integer startY = template.getStartY();Integer endX = template.getEndX();Integer endY = template.getEndY();List<Integer> imagePoints = Arrays.asList(startX, startY, endX, endY);ImageWatermark image = new ImageWatermark(photoUrl, imagePoints);images.add(image);}}try {BufferedImage bufferedImage = ImageUtil.watermarkImgBase64(baseImgUrl, images, texts);OutputStream os = new FileOutputStream(zipPath + String.valueOf(i + 1) + name + ".jpg");ImageIO.write(bufferedImage, "jpg", os);//更新meetingApply的状态MeetingApply apply = new MeetingApply();apply.setId(meetingApply.getId());apply.setCreateCardDate(new Date());apply.setIsCreateCard("Yes");apply.setCardUrl("generateGuestCard/" + datePath + String.valueOf(i + 1) + name + ".jpg");meetingApplyService.update(apply);} catch (Exception e) {e.printStackTrace();}String zipFile = CompressUtil.zipFile(new File(zipPath), "zip");response.setContentType("APPLICATION/OCTET-STREAM");String fileName = "guestCard" + uuid + ".zip";response.setHeader("Content-Disposition", "attachment; filename=" + fileName);//ZipOutputStream out = new ZipOutputStream(response.getOutputStream());OutputStream out = response.getOutputStream();File ftp = ResourceUtils.getFile(zipFile);InputStream in = new FileInputStream(ftp);// 循环取出流中的数据byte[] b = new byte[100];int len;while ((len = in.read(b)) != -1) {out.write(b, 0, len);}in.close();out.close();} catch (Exception e) {e.printStackTrace();}}}六、页⾯效果到此这篇关于Java实现画图的详细步骤(完整代码)的⽂章就介绍到这了,更多相关Java实现画图内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
java绘图(基于Graphics2D)1.绘图基本操作请参考下⾯基础⽰例:1int width = 200, height = 250;2//创建图⽚对象3 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);4//基于图⽚对象打开绘图5 Graphics2D graphics = image.createGraphics();6//绘图逻辑 START (基于业务逻辑进⾏绘图处理)……78//绘制圆形9 graphics.setColor(Color.BLACK);10 Ellipse2D.Double ellipse = new Ellipse2D.Double(20, 20, 100, 100);11 graphics.draw(ellipse);1213// 绘图逻辑 END14//处理绘图15 graphics.dispose();16//将绘制好的图⽚写⼊到图⽚17 ImageIO.write(image, "png", new File("abc.png"));如上代码所⽰,使⽤java绘图基本操作流程如下: a.得到⼀个 BufferedImage ,可以是直接指定分辨率new⼀个空图⽚,也 b.基于此BufferedImage 创建⼀个绘图对象,使⽤createGraphics ⽅法,得 Graphics2D 实例 c.使⽤Graphics2D 实例进⾏画图,所有绘图坐标基于创建此Graphics2D 的BufferedImage。
⽰例中在图⽚上画了⼀个圆形。
d.调⽤Graphics2D 对象的 dispose() ⽅法,进⾏绘图处理,使绘图效果应⽤到BufferedImage 对象 e.使⽤ImageIO类的write函数将图⽚对象转换到⽂件或⼆进制流上⾯是使⽤java进⾏绘图的基本流程,其中步骤c涉及到很多绘图细节。
Java中的Graphics2D类基本使用的教程Java中的Graphics2D类基本使用的教程Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。
绘图属性Graphics2D定义了几种方法,用于添加或改变图形的状态属性。
可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式;设定平移、旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。
图形状态属性用特定的对象存储。
1. stroke属性stroke属性控制线条的宽度、笔形样式、线段连接方式或短划线图案。
该属性的设置需要先创建BasicStroke对象,再调用setStroke()方法来设置。
创建BasicStroke对象的方法有:BasicStroke(float w):指定线条宽w。
BasicStroke(float w,int cap, int join):cap是端点样:CAP_BUTT(无修饰),CAP_ROUND(半圆形末端),CAP_SQUARE(方形末端,默认值)。
Join定义两线段交汇处的连接方式:JOIN_BEVEL(无修饰),JOIN_MTTER(尖形末端,默认值),JOIN_ROUND(圆形末端)。
2. paint属性paint属性控制填充效果。
先调用以下方法确定填充效果,理用setPaint()方法设置。
GradientPaint(float x1,float y1,Color c1,float x2,flaot y2,Color c2):从(x1,y1)到(x2,y2)颜色从c1渐变到c2。
其中:参数c1,c2决定这个渐变色是从颜色c1渐变到颜色c2。
参数x1,y1,x2,y2决定了渐变的强弱,即要求从点(x1,y1)出发到达点(x2,y2),颜色从c1变成c2。
JAVA图像处理详解2007-08-10 17:03如果你对图像处理感兴趣,而且需要使用GIF、JPEG和PNG以外的其它图像格式,或者希望改善JPEG图像处理的性能但不知道到哪里寻找适当的方法,或者需要通过几何运算(包括非线性变换)来处理图像,不必再为此苦恼了,答案就在这里——来自Sun公司的Java高级图像处理API和JAI图像I/O API 1.0 RC。
JAI API是Java Media API的一部分,与之相伴的还包括Java 2D API、Java 3D API、Java Speech API和其他一些API。
Java高级图像处理API是作为Java规范请求(JSP)34的一部分而开发的,是对J2SE version 1.3+版的扩展,主要用于处理图像。
最初发布的版本是1.0,JDC(Java Developer Connection)提供了一个预览版1.1.2 beta。
(最新进展情况请查阅README.html文件。
)与AWT 和Java 2D相比,JAI API提供了更丰富的图像处理,包括对许多通用图像操作的内在支持。
不过本文的目的不是讨论JAI API,而是伴随这些API但分离到它自己的可安装库中的一组图像读写器(codec)类,即Java高级图像处理图像I/O工具1.0 RC。
该RC提供了可以插接到J2SE 1.4的图像I/O框架上的一些功能。
作为JSR-15一部分而开发的图像I/O API提供了一个支持不同图像格式的可插拔框架。
标准J2SE 1.4版本身支持GIF、JPEG和PNG图像格式,而JAI图像I/O RC则提供了更多主流图像格式的编码解码器。
只要加上针对操作平台的适当版本,以前开发的应用程序就可以处理这些新的图像格式。
要理解JAI图像I/O工具的使用,需要首先了解图像I/O库。
在安装和介绍图像I/O工具包之前,我们先看一看图像I/O库。
图像I/O库图像I/O库是J2SE 1.4的标准API,放在javax.imageio包内。
JavaMeteoInfo解析与绘图代码教程详解最近太忙了,终于有时间继续写了,上⽂说到了基本上的绘图⽅法,但缺少⾊阶呈现,⼀般图叠加着地图上,后端不需要管⾊阶,但也要注意web页⾯⾊阶和我们的⽣成⾊阶⼀定要对的上对于后端导出图⽚的话,就需要添加⾊阶了,这⼀⽂很简单,就涉及⾊阶,名称,⽹格刻度线顺便对代码我进⾏了优化,看起来更直接MeteoDataInfo meteoDataInfo = new MeteoDataInfo();meteoDataInfo.openMICAPSData("D:\\解析数据\\cldas\\cldas\\TEM\\20081000.000");GridData grid = meteoDataInfo.getGridData();//读取地图AVectorLayer scmap = MapDataManage.readMapFile_ShapeFile("C:\\Users\\Administrator\\Downloads\\好例⼦⽹_全国省、县界线shp格式⽮量图(精确到县区域)\\全国省、县界线shp格式⽮量图(精确到县区域)\\sichuan.shp"); //读取地图BVectorLayer qgmap = MapDataManage.readMapFile_ShapeFile("E:\\shp\\四川\\四川省(3)_市界.shp");//描述地图边界线PolygonBreak pb = (PolygonBreak) qgmap.getLegendScheme().getLegendBreak(0);//是否设置填充pb.setDrawFill(false);//设置轮廓颜⾊pb.setOutlineColor(Color.black);//读取⾊阶LegendScheme als = LgsUtil.readFromLgs("D:\\apache-tomcat-8.0.50\\alt⾊阶\\TEM.lgs");//绘制图层VectorLayer layer = DrawMeteoData.createShadedLayer(grid,als,"","",true);//创建视图MapView view = new MapView();layer = layer.clip(scmap);//叠加图层view.addLayer(layer);view.addLayer(qgmap);//视图设置MapLayout layout = new MapLayout();//去除图形边框layout.getActiveMapFrame().setDrawNeatLine(true);//抗锯齿layout.getActiveMapFrame().setMapView(view);view.setAntiAlias(true);layout.setAntiAlias(true);//根据视图计算视图的宽⾼Extent extent = view.getExtent();int size = 800;Rectangle rectangle = new Rectangle(size, (int) (size * 1D / extent.getWidth() * extent.getHeight()));//设置地图区域⼤⼩和外边距int width = rectangle.width;int left = 50;int height = rectangle.height;int right = 140;int top = 50;int bottom = 50;//设置页⾯边界layout.setPageBounds(new Rectangle(0, 0, width + left + right, height + top + bottom));//获取地图框MapFrame frame = layout.getActiveMapFrame();//设置布局边界frame.setLayoutBounds(new Rectangle(left, top, width, height));//绘制⽹格刻度线frame.setDrawGridLine(true);//设置⽹格间隔值frame.setGridXDelt(0.5);frame.setGridYDelt(0.5);//设置图例Rectangle bounds = layout.getActiveMapFrame().getLayoutBounds();LayoutLegend legend = layout.addLegend(bounds.x + bounds.width + 15, 0);legend.setLegendStyle(LegendStyles.Normal);legend.setTop(bounds.y + (bounds.height - legend.getHeight()) / 2);legend.setLegendLayer(layer);//导出layout.exportToPicture(PathUtil.getDeskPath()+"/1.png");以上的⽅法我只设定了刻度线和⾊阶,其他的也很简单,我在下⾯说明⼀下标题设定-放到设定好视图⼤⼩的后⾯Rectangle bounds = layout.getActiveMapFrame().getLayoutBounds();layout.addText(title, bounds.x + bounds.width / 2, y, 18);到⽬前简单的绘制与设定就没有什么可说的了,基本上的操作在⽂章⾥都有了,都是⼀些样式的东西,这些都是绘制已经进⾏插值的图⽚,但在开发中,我们也会遇到天擎和CIMISS直接返回的站点数据,这个怎么绘制下⼀节说明⼀下,再后⾯的章节就是个别问题的研究了到此这篇关于Java MeteoInfo解析与绘图代码教程详解的⽂章就介绍到这了,更多相关Java MeteoInfo绘图教程内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
使⽤java实现各种数据统计图(柱形图,饼图,折线图)最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给⽤户,这就要⽤到数据统计图,要实现这个功能就需要⼏个第三⽅包了:1. jfreechart-1.0.13.jar2. jcommon-1.0.16.jar3. gnujaxp.jar先来看⼀下,最终效果图:接下来,我们⼀步步来实现本程序。
1,建,⽴java项⽬,在这个项⽬在建⽴⼀个新的⽂件夹lib;2,将上述三个jar包,复制到lib3,然后右键点击这个java项⽬,选择Properties4,在左侧列表⾥选中Java Build Path,右侧选中Libraries5,点击Add JARs6,然后去选择这个项⽬中lib⽂件夹中的三个jar,点击确定成功后,项⽬中会多⼀个⽂件夹为:Referenced Libraries⼆,实现柱形图的java代码:import java.awt.Font;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;public class BarChart {ChartPanel frame1;public BarChart(){CategoryDataset dataset = getDataSet();JFreeChart chart = ChartFactory.createBarChart3D("⽔果", // 图表标题"⽔果种类", // ⽬录轴的显⽰标签"数量", // 数值轴的显⽰标签dataset, // 数据集PlotOrientation.VERTICAL, // 图表⽅向:⽔平、垂直true, // 是否显⽰图例(对于简单的柱状图必须是false)false, // 是否⽣成⼯具false // 是否⽣成URL链接);//从这⾥开始CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象CategoryAxis domainAxis=plot.getDomainAxis(); //⽔平底部列表domainAxis.setLabelFont(new Font("⿊体",Font.BOLD,14)); //⽔平底部标题domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状rangeAxis.setLabelFont(new Font("⿊体",Font.BOLD,15));chart.getLegend().setItemFont(new Font("⿊体", Font.BOLD, 15));chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体//到这⾥结束,虽然代码有点多,但只为⼀个⽬的,解决汉字乱码问题frame1=new ChartPanel(chart,true); //这⾥也可以⽤chartFrame,可以直接⽣成⼀个独⽴的Frame }private static CategoryDataset getDataSet() {DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(100, "北京", "苹果");dataset.addValue(100, "上海", "苹果");dataset.addValue(100, "⼴州", "苹果");dataset.addValue(200, "北京", "梨⼦");dataset.addValue(200, "上海", "梨⼦");dataset.addValue(200, "⼴州", "梨⼦");dataset.addValue(300, "北京", "葡萄");dataset.addValue(300, "上海", "葡萄");dataset.addValue(300, "⼴州", "葡萄");dataset.addValue(400, "北京", "⾹蕉");dataset.addValue(400, "上海", "⾹蕉");dataset.addValue(400, "⼴州", "⾹蕉");dataset.addValue(500, "北京", "荔枝");dataset.addValue(500, "上海", "荔枝");dataset.addValue(500, "⼴州", "荔枝");return dataset;}public ChartPanel getChartPanel(){return frame1;}}效果图如下:但我们把private static CategoryDataset getDataSet(){}⽅法中的数据变化⼀下后,⼜会形成另⼀种效果,⽐如说我们改成:private static CategoryDataset getDataSet() {DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(100, "苹果", "苹果");dataset.addValue(200, "梨⼦", "梨⼦");dataset.addValue(300, "葡萄", "葡萄");dataset.addValue(400, "⾹蕉", "⾹蕉");dataset.addValue(500, "荔枝", "荔枝");return dataset;}效果图如下:三实现饼状图的java代码:package com.njue.testJFreeChart;import java.awt.Font;import java.text.DecimalFormat;import java.text.NumberFormat;import javax.swing.JPanel;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import bels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.PiePlot;import org.jfree.data.general.DefaultPieDataset;public class PieChart {ChartPanel frame1;public PieChart(){DefaultPieDataset data = getDataSet();JFreeChart chart = ChartFactory.createPieChart3D("⽔果产量",data,true,false,false);//设置百分⽐PiePlot pieplot = (PiePlot) chart.getPlot();DecimalFormat df = new DecimalFormat("0.00%");//获得⼀个DecimalFormat对象,主要是设置⼩数问题NumberFormat nf = NumberFormat.getNumberInstance();//获得⼀个NumberFormat对象StandardPieSectionLabelGenerator sp1 = new StandardPieSectionLabelGenerator("{0} {2}", nf, df);//获得StandardPieSectionLabelGenerator对象 pieplot.setLabelGenerator(sp1);//设置饼图显⽰百分⽐//没有数据的时候显⽰的内容pieplot.setNoDataMessage("⽆数据显⽰");pieplot.setCircular(false);pieplot.setLabelGap(0.02D);pieplot.setIgnoreNullValues(true);//设置不显⽰空值pieplot.setIgnoreZeroValues(true);//设置不显⽰负值frame1=new ChartPanel (chart,true);chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象piePlot.setLabelFont(new Font("宋体",Font.BOLD,10));//解决乱码chart.getLegend().setItemFont(new Font("⿊体",Font.BOLD,10));}private static DefaultPieDataset getDataSet() {DefaultPieDataset dataset = new DefaultPieDataset();dataset.setValue("苹果",100);dataset.setValue("梨⼦",200);dataset.setValue("葡萄",300);dataset.setValue("⾹蕉",400);dataset.setValue("荔枝",500);return dataset;}public ChartPanel getChartPanel(){return frame1;}}效果图如下:四实现折线图的java代码:package com.njue.testJFreeChart;import java.awt.Font;import java.text.SimpleDateFormat;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.DateAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.XYPlot;import org.jfree.data.time.Month;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.data.xy.XYDataset;public class TimeSeriesChart {ChartPanel frame1;public TimeSeriesChart(){XYDataset xydataset = createDataset();JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("Legal & General单位信托基⾦价格", "⽇期", "价格",xydataset, true, true, true); XYPlot xyplot = (XYPlot) jfreechart.getPlot();DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));frame1=new ChartPanel(jfreechart,true);dateaxis.setLabelFont(new Font("⿊体",Font.BOLD,14)); //⽔平底部标题dateaxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题ValueAxis rangeAxis=xyplot.getRangeAxis();//获取柱状rangeAxis.setLabelFont(new Font("⿊体",Font.BOLD,15));jfreechart.getLegend().setItemFont(new Font("⿊体", Font.BOLD, 15));jfreechart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体 }private static XYDataset createDataset() { //这个数据集有点多,但都不难理解 TimeSeries timeseries = new TimeSeries("legal & general欧洲指数信任", org.jfree.data.time.Month.class);timeseries.add(new Month(2, 2001), 181.80000000000001D);timeseries.add(new Month(3, 2001), 167.30000000000001D);timeseries.add(new Month(4, 2001), 153.80000000000001D);timeseries.add(new Month(5, 2001), 167.59999999999999D);timeseries.add(new Month(6, 2001), 158.80000000000001D);timeseries.add(new Month(7, 2001), 148.30000000000001D);timeseries.add(new Month(8, 2001), 153.90000000000001D);timeseries.add(new Month(9, 2001), 142.69999999999999D);timeseries.add(new Month(10, 2001), 123.2D);timeseries.add(new Month(11, 2001), 131.80000000000001D);timeseries.add(new Month(12, 2001), 139.59999999999999D);timeseries.add(new Month(1, 2002), 142.90000000000001D);timeseries.add(new Month(2, 2002), 138.69999999999999D);timeseries.add(new Month(3, 2002), 137.30000000000001D);timeseries.add(new Month(4, 2002), 143.90000000000001D);timeseries.add(new Month(5, 2002), 139.80000000000001D);timeseries.add(new Month(6, 2002), 137D);timeseries.add(new Month(7, 2002), 132.80000000000001D);TimeSeries timeseries1 = new TimeSeries("legal & general英国指数信任", org.jfree.data.time.Month.class);timeseries1.add(new Month(2, 2001), 129.59999999999999D);timeseries1.add(new Month(3, 2001), 123.2D);timeseries1.add(new Month(4, 2001), 117.2D);timeseries1.add(new Month(5, 2001), 124.09999999999999D);timeseries1.add(new Month(6, 2001), 122.59999999999999D);timeseries1.add(new Month(7, 2001), 119.2D);timeseries1.add(new Month(8, 2001), 116.5D);timeseries1.add(new Month(9, 2001), 112.7D);timeseries1.add(new Month(10, 2001), 101.5D);timeseries1.add(new Month(11, 2001), 106.09999999999999D);timeseries1.add(new Month(12, 2001), 110.3D);timeseries1.add(new Month(1, 2002), 111.7D);timeseries1.add(new Month(2, 2002), 111D);timeseries1.add(new Month(3, 2002), 109.59999999999999D);timeseries1.add(new Month(4, 2002), 113.2D);timeseries1.add(new Month(5, 2002), 111.59999999999999D);timeseries1.add(new Month(6, 2002), 108.8D);timeseries1.add(new Month(7, 2002), 101.59999999999999D);TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(); timeseriescollection.addSeries(timeseries);timeseriescollection.addSeries(timeseries1);return timeseriescollection;}public ChartPanel getChartPanel(){return frame1;}}效果图如下:再来看⼀下主⽅法:import java.awt.GridLayout;import javax.swing.JFrame;public class mainClass {public static void main(String args[]){JFrame frame=new JFrame("Java数据统计图");frame.setLayout(new GridLayout(2,2,10,10));frame.add(new BarChart().getChartPanel()); //添加柱形图frame.add(new BarChart1().getChartPanel()); //添加柱形图的另⼀种效果frame.add(new PieChart().getChartPanel()); //添加饼状图frame.add(new TimeSeriesChart().getChartPanel()); //添加折线图frame.setBounds(50, 50, 800, 600);frame.setVisible(true);}}五总结以上都是⼀个简单的例⼦去实现了,想了解更深的同学可⾃⾏查询资料,其实以上代码都通俗易懂,只要结合⾃⼰的实际情况,便可开发出属于⾃⼰的Application,⼤家可以看出我这⾥是在Application上实现的,其实更多情况数据统计图在javaweb 上应⽤更多,⼤家也可⾃⾏了解。
如何引用jar包project ---> project properties ---> 左侧选择path ---> 右侧选择requiredlibraries ---> add ---> archives ,然后找到你要导入的包,点击OK即可JFREECHART DOCUMENT下面以柱状图和饼图以及折线图为例,介绍图形创建方法。
1)柱状图org.jfree.chart.ChartFactory这个工厂类有createBarChart、createStackedBarChart、createBarChart3D、createStackedBarChart3D,这几个工厂方法创建不同类型的柱状图,比较重要的是PlotOrientation.VERTICAL 让平行柱垂直显示,而PlotOrientation.HORIZONTAL 则让平行柱水平显示。
对柱状图影响较大的几个类包括:org.jfree.chart.axis.CategoryAxis、org.jfree.chart.axis.ValueAxis、org.jfree.chart.renderer.BarRenderer、org.jfree.chart.renderer. BarRenderer3D。
具体实现步骤:(1)创建用于图形生成所要的数据集对象。
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);其中:rowKeys表示X轴数据,columnKeys表示Y轴数据,data表示填充柱状图所要的实际数据(来自于数据库)。
(2)创建图形对象。
JFreeChart chart = ChartFactory.createBarChart3D("标题", //图形的标题null,//X轴标题null,//Y轴标题dataset,//数据PlotOrientation.VERTICAL,,//图表方向true,//是否显示图例false,//启用热键false) //启用超键接createBarChart3D方法是ChartFactory工厂类里的一个方法,用于3D柱状图的生成,该类继承自JFreeChart。
摘要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
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);}});}}。