Java学习记录 AWT绘图篇

绘制图形

Canvas画布类

Class Canvas

java.lang.Object
java.awt.Component
java.awt.Canvas

用来 绘制图形 或 捕获用户输入的事件。绘制图形需要绘图方法实现绘制图形

方法说明
paint(Graphics g)绘图
repaint(Graphics g)重新绘图(刷新

Graphics绘图类

Class Graphics

java.lang.Object
java.awt.Graphics

Graphics绘图类 是所有图形的抽象基类,它提供了绘图常用的方法

图形方法
弧形drawArc(int x , int y , int width , int height , int startAngle , int arcAngle)
直线drawLine(int x1 , int y1 , int x2 , int y2)
椭圆drawOval(int x , int y , int width , int height)
多边形drawPolygon(int[] xPoints , int[] yPoints , int nPoints)
多边线drawPolyline(int[] xPoints , int[] yPoints , int nPoints)
矩形drawRect(int x , int y , int width , int height)
圆角矩形drawRoundRect(int x , int y , int width , int height , int arcWidth, int arcHeight)
实心弧形fillArc(int x , int y , int width , int height , int height , int startAngle , int arcAngle)
实心椭圆fillOval(int x , int y , int width , int height)
实心多边形fillPolygon(int[] xPoints , int[] yPoints , int nPoints)
实心矩形fillRect(int x , int y , int width , int height)
实心圆角矩形fillRoundRect(int x , int y , int width , int height , int arcWidth, int arcHeight)
参数说明
x坐标X
y坐标Y
width宽度
height高度
startAngle起始角度
arcAngle相对起始角度的弧的角度范围
xPointsX坐标的数组
yPointsY坐标的数组
nPoints总数
arcWidth四角圆弧的水平直径
arcHeight四角圆弧的垂直直径

Graphics2D新绘图类

Class Graphics2D

java.lang.Object
java.awt.Graphics
java.awt.Graphics2D

Graphics类的扩展 Graphics2D新绘图类,它必须要 draw()和fill() 方法 绘图
方法的参数需要Shape图形接口实现绘图(接口在 java.awt.geom 包下

抽象方法说明
draw(Shape form)绘制图形
fill(Shape form)填充图形

form:Shape图形接口的对象

代码绘制流程

  1. 创建窗体对象
  2. 创建 Canvas画布类 并添加入窗体容器里
  3. 调用 Canvas画布类中 paint(Graphics g)方法
  4. 调用 paint(Graphics g)方法 中的 Graphics对象 或 创建Graphics2D绘图对象
  5. 调用 绘图的抽象方法 实现绘图

方式二:(从步骤4开始,适合批量绘图)

  1. 实例 java.awt.geom包 中的图形类,赋值至 Shape接口 对象
  2. 传参 调用 Graphics2D类 中的 draw() 或 fill() 方法 实现绘图

大致例子:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RectangularShape;public class DrawFrame extends JFrame {private Container c = getContentPane();public DrawFrame(){setBounds(400 , 300 , 360 , 160);setDefaultCloseOperation(3);//Canvas匿名画布类 重写paint()绘图方法c.add(new Canvas(){@Overridepublic void paint(Graphics g){Graphics2D g2 = (Graphics2D) g;
//方法一g2.drawRoundRect(10 , 5 , 100 , 100 , 10 , 10);g2.fillOval(20 , 15 , 80 , 80);
//方法二//声明图形数组Shape[] shapes = new Shape[4];//以double精度创建//绘制圆shapes[0] = new Ellipse2D.Double(120, 5 , 100 ,100);//绘制矩形shapes[1] = new Rectangle2D.Double(230 ,5 ,100 ,100);//绘制矩形shapes[2] = new Rectangle2D.Double(130 ,15 ,80 ,80);//绘制圆shapes[3] = new Ellipse2D.Double(240 ,15 ,80 ,80);for(Shape tmp : shapes){//Rectangle2D bounds = tmp.getBounds2D();    (Rectangle2D是RectangularShape的子类//RectangularShape类 用来查询和修改矩形框架的类RectangularShape bounds = tmp.getBounds2D();if(bounds.getWidth() == 80){//第二组图形创建g2.fill(tmp);}else{//第一组图形创建g2.draw(tmp);}}}});}public static void main(String[] args) {new DrawFrame().setVisible(true);}
}

运行结果:
img

绘图属性

颜色

Class Color

java.lang.Object
java.awt.Color

Color类 提供设置颜色的对象
构造方法

Color(int R , int G , int B)
Color(int RGB)

参数说明

R: 红色颜色值
G: 绿色颜色值
B: 蓝色颜色值
RGB: 组合RGB颜色值

Color常量值 有已定义好的颜色对象,可直接调用(自行API查

画笔

Class BasicStroke

java.lang.Object
java.awt.BasicStroke

BasicStroke类 为图形轮廓定义基本渲染属性(定义边线属性
实现前提需要Stroke接口实现类!!!

构造方法

BasicStroke()
BasicStroke(float width)
BasicStroke(float width , int cap , int join)
BasicStroke(float width , int cap , int join , float miterlimit)
BasicStroke(float width , int cap , int join , float miterlimit , float[] dash , float dash_phase)
参数说明
width画笔宽度
cap线端点的装饰
join应用在路径线段交会处的装饰
miterlimit斜接处的剪裁限制
dash虚线模式的数组
dash_phase开始虚线模式的偏移量

CAP参数 3个常量及标识
img
JOIN参数 3常量及标识
img

代码实现流程:

  1. 创建Stroke接口对象,实例BasicStroke对象
  2. 设置画笔 setStroke(Stroke)方法

大致例子:

import javax.swing.*;
import java.awt.*;public class BrushTest extends JFrame {public BrushTest(){setBounds(400 ,300 ,300 ,230);setDefaultCloseOperation(3);add(new MyCanvas());}class MyCanvas extends Canvas{@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D)g;Stroke[] s = {new BasicStroke(10 , BasicStroke.CAP_ROUND ,BasicStroke.JOIN_ROUND),new BasicStroke(10 , BasicStroke.CAP_BUTT , BasicStroke.JOIN_ROUND),new BasicStroke(10 , BasicStroke.CAP_SQUARE , BasicStroke.JOIN_ROUND),new BasicStroke(10 , BasicStroke.CAP_BUTT , BasicStroke.JOIN_BEVEL)};//    图形No.1g2.setStroke(s[0]);g2.drawLine(10,10 , 230,10);g2.setStroke(s[1]);g2.drawLine(10,30 , 230,30);g2.setStroke(s[2]);g2.drawLine(10,50 , 230,50);//    图形No.2//更改颜色g2.setColor(Color.CYAN);g2.setStroke(s[3]);int[]   x = {20 ,200 ,20 ,200},y = {80 ,80 ,180 ,180};g2.drawPolyline(x , y , 4);}}public static void main(String[] args) {new BrushTest().setVisible(true);}
}

运行结果:
img

绘制文本

设置字体

Class Font

java.lang.Object
java.awt.Font

Font类 封装字体的大小、样式等属性
构造方法

Font(String naem , int style , int size)

name: 字体名称
style: 字体样式
size: 字体大小

字体样式常量
普通PLAIN
粗体BOLD
斜体ITALIC
粗体&斜体ITALIC | BOLD

显示文字

Graphics2D提供了 drawString()方法 ,可以抛开 JLable类 写入窗体的方法

Graphics2D | GraphicsdrawString(String str , int x , int y)Graphics2DdrawString(String str , float x , float y)

str: 文本
x: 坐标X
y: 坐标Y

import javax.swing.*;
import java.awt.*;//4.绘制文本
public class DrawTextTest extends JFrame {public DrawTextTest() {setBounds(400, 300, 230, 150);setDefaultCloseOperation(3);add(new Canvas() {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;Font[] f = {new Font("微软雅黑", Font.BOLD, 23),new Font("微软雅黑", Font.ITALIC, 23),new Font("微软雅黑", Font.ITALIC | Font.BOLD, 23)};g2.setFont(f[0]);g2.drawString("Sanscan12" , 20 , 30);g2.setFont(f[1]);g2.drawString("Sanscan12" , 20 , 60);g2.setFont(f[2]);g2.drawString("Sanscan12" , 20 , 90);}});}public static void main(String[] args) {new DrawTextTest().setVisible(true);}
}

运行结果:
img

绘制图片

Graphics提供了 drawImage()方法,可以进行绘制图片处理图片,抛开 JLable类 写入窗体的方法

drawImage(Image img , int x , int y , ImageObserver observer)

img: 图片对象
x: 坐标X
y: 坐标Y
observer: 窗体/容器

图像处理

缩放

重写drawImage()方法,区别6个参数,要原有初始大小的图片

drawImage(Image img , int x , int y , int width , int height , ImageObserver observer)

width: 图片新宽度
height: 图片新高度

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//2.缩放
// Main类调用 该实例
public class SizeTest extends Canvas {int W , H ;Image image;static int count = 0;static JButton[] jb = {new JButton("放大"),new JButton("缩小")};public SizeTest(){this.image = new ImageIcon("Image1.png").getImage();this.W = image.getWidth(this);this.H = image.getHeight(this);Canvas c = this;//添加响应// 放大jb[0].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {count+=1;c.repaint();}});//缩小jb[1].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {count-=1;c.repaint();}});}@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D)g;g2.drawImage(image , 0 , 0 ,W+count , H+count , this);}public static JButton[] getJButtonAll(){return jb;}
}

运行结果:
在这里插入图片描述

翻转

重写drawImage()方法,区别10个参数,水平垂直翻转的作用

drawlmage(Image img , int dx1 , int dy1 , int dx2 , int dy2 , int sx1 , int sy1 , int sx2 , int sy2 , ImageObserver observer)

dx1/dy1: 目标矩形对应角XY坐标
dx2/dy2: 目标矩形对应角XY坐标
sx1/sy1: 源矩形左上角XY坐标
sx2/sy2: 源矩形右下角XY坐标

img

运行结果:
img

旋转

重写drawImage()方法,区别6个参数,旋转的前提需要调用Graphics2D类的rotate()方法,进行旋转

drawImage(Image img , int x , int y , int width , int height , ImageObserver observer)

方法
rotate(double thete)
thete:旋转弧度

参数的弧度值可以使用Math类的toRadians()方法将角度转换为弧度(近似值)

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//2.旋转
// Main类调用 该实例
public class WhirlTest extends Canvas {int W , H ;Image image;static int count = 0;static JButton[] jb = {new JButton("左转"),new JButton("右转")};public WhirlTest(){this.image = new ImageIcon("Image1.png").getImage();this.W = image.getWidth(this);this.H = image.getHeight(this);Canvas c = this;//添加响应// 左jb[0].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {count++;c.repaint();}});//右jb[1].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {count--;c.repaint();}});}@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D)g;//toRadians:以度为单位的角度转换为以弧度(近似值)g2.rotate(Math.toRadians(count));g2.drawImage(image , 0 , 0 ,W , H , this);}public static JButton[] getJButtonAll(){return jb;}
}

运行结果:
在这里插入图片描述

倾斜

重写drawImage()方法,区别6个参数,旋转的前提需要调用Graphics2D类的shear()方法,实现倾斜

drawImage(Image img , int x , int y , int width , int height , ImageObserver observer)

方法
shear(double shx , double shy)
shx: 水平倾斜量 ; shy: 垂直倾斜量

img

运行结果:
在这里插入图片描述

处理Main执行

以上 图片处理 代码需要Main类执行

import javax.swing.*;
import java.awt.*;//1.图形显示
public class Main extends JFrame {//public JButton//        jb1 = new JButton("+"),//        jb2 = new JButton("-");//public Canvas canvas = null;public Main(Canvas c , JButton jb1 ,JButton jb2){setBounds(400 , 300 , 666 , 600);setDefaultCloseOperation(3);JPanel jp = new JPanel();jp.add(jb1);jp.add(jb2);add(jp , BorderLayout.SOUTH);add(c);}public static void main(String[] args) {/*  自行实例*   1.GraphTest    //显示图片*   2.SizeTest     //放大与缩小*   3.TurnTest    //翻转*   4.WhirlTest    //旋转*   5.TiltTest     //倾斜* */Canvas canvas = new TiltTest();//更改实例对象即可JButton[]  jb = TiltTest.getJButtonAll();//更改类new Main(canvas , jb[0] , jb[1]).setVisible(true);}
}
123456789101112131415161718192021222324252627282930313233343536

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux pmap 内存泄露,一个驱动导致的内存泄漏问题的分析过程(meminfo-pmap-slabtop-alloc_calls)...

关键词:sqllite、meminfo、slabinfo、alloc_calls、nand、SUnreclaim等等。下面记录一个由于驱动导致的内存泄漏问题分析过程。首先介绍问题背景,在一款嵌入式设备上,新使用sqllite库进行数据库操作,在操作数据(大量读写操作)一段…

Java基础--awt详解以及简单应用

GUI 图形用户界面 CLI 命令行用户接口 Java为GUI提供的对象存在java.Awt和Javax.Swing两个包中. Java当中如何完成图形化界面的制作呢? AWT:abstract Window ToolKit.需要调用本地系统实现功能.属于重量级控件.依赖于平台.跨平台性不是特别好. Javax.Swing:在AWT基础上.建立一…

Java图形化界面设计之容器(JFrame)详解

Java图形化界面设计之容器(JFrame)详解 Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们…

10个最受欢迎的JavaScript图表库

目前网上有很多用于绘制图表图形的免费JavaScript插件和图表库,技术学派在这里给大家推荐10个比较强大的绘制图表图形的JavaScript图表库。其中一些插件需要主流浏览器的支持,而另外一些经过整合后,也能在不同的平台和老版本的浏览器上工作。…

sudo 命令_su、sudo、sudo su、sudo -i的用法和区别

sudo 命令 1、sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是…

c语言不能在函数中求数组大小,C语言中数组长度不能用变量定义吗?

翻翻过去那场雪1、C语言中不支持。C中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用。做为解决方案,你可以使用C式的malloc函数或者C式的new函数来在堆上动态分配内存,这样长度是完全可…

Java如何基于ProcessBuilder类调用外部程序

Java如何基于ProcessBuilder类调用外部程序 demo1 Testpublic void testProcessBuilder() {ProcessBuilder processBuilder new ProcessBuilder(); // processBuilder.command("ping","127.0.0.1");processBuilder.command("ipconfig");//…

计算机专业课程设计报告c语言,计算机程序设计(C语言)课程设计报告.doc

计算机程序设计(C语言)课程设计报告.doc计算机程序设计C语言课程设计报告题目电子动画时钟 学院 机电工程学院专业 班级090109班学号 姓名 指导教师 设计日期 一、概述选题背景 随着社会的进步和科技的发展,电子钟表逐渐成为了人们生活中不可缺少的一部分。设计思路…

c语言用栈编写数制转换程序,数制转换-栈的应用(C++实现)

本程序实现的是十进制与不同进制之间的的数据转换,利用的数据结构是栈,基本数学方法辗转相除法。conversion.h#includeusing namespace std;//将十进制的数据n转换成m进制的数据stack conversion(unsigned int n,unsigned int m){stack s;while(n){s.pus…

两个变量实现查找坏环c语言,C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...

程序员无言 2020-07-07一、C语言程序的构成与C、Java相比,C语言其实很简单,但却非常重要。因为它是C、Java的基础。不把C语言基础打扎实,很难成为程序员高手。1、C语言的结构先通过一个简单的例子,把C语言的基础打牢。C语言的结构…

累加器A用c语言,累加器A的主要作用是什么_一文解析累加器a和acc的区别

描述累加器简介在中央处理器中,累加器(accumulator) 是一种寄存器,用来储存计算产生的中间结果。如果没有像累加器这样的寄存器,那么在每次计算 (加法,乘法,移位等等) 后就必须要把结果写回到内存,也许马上…

Java中的<<、>>、>>>运算符

二进制中的原码、反码、补码 有符号数: 对于有符号数而言,符号的正、负机器是无法识别的,但由于“正、负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示“负”,这样符号也被数字化了&…

actionscript 3.0 怎么写android 程序,(ActionScript3.0笔记)第一个程序HelloWorld!

(ActionScript3.0笔记)第一个程序HelloWorld!创建我的第一个ActionScript3.0程序--HelloWord!首先下载ActionScript3.0的集成开发环境,FLASH CS4 Professional。从网站下载FLASH CS4 Professional软件的安装包程序,下载好后进行安装。安装后在…

android.app.activityview,ViewModel 概览

ViewModel 概览ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。注意:如需将 ViewModel导入 Android 项目,请参阅 Lifecycle 版本说明中关于声明依赖项的说明。Android 框架可…

使用Navicat将数据从Excel导入到MySQL数据库

数据库中的表已经建好了,现在要将数据从Excel导入 要求:Excel中要有一行为字段名(可以与数据表中的字段名顺序不一样) 具体步骤 1、右键单击表,选择 导入向导 2、选择数据导入格式,然后点击下一步 3…

html5 a-z字母排序,Mint UI实现A-Z字母排序的城市选择列表

本文实例为大家分享了Mint Ul实现A-Z字母排序的城市选择列表的具体代码,供大家参考,具体内容如下效果图如下:项目文件存放路径图:所有代码如下:import city from "../assets/json/city"//导入所有城市的JSON…

Geometry几何结构与WKT空间坐标计算缓冲距离模型构建

geometry,英语单词,名词,意思是“几何学几何结构”。 http://www.baike.com/wiki/WKTWKT,是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(…

html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容)

原帖地址:http://blog.csdn.net/phunxm/article/details/42174937/仅供我个人收藏学习,原博主如不同意请联系qq651263878进行删除,在此表示感谢以及歉意。1.iPhone尺寸规格后续上市的iPhone7以及iPhone7plus 与六代相同1 inch 2.54cm 25.4…

flink checkpoint 恢复_Flink解析 | Apache Flink结合Kafka构建端到端的ExactlyOnce处理

周凯波(宝牛)阿里巴巴技术专家,四川大学硕士,2010年毕业后加入阿里搜索事业部,从事搜索离线平台的研发工作,参与将搜索后台数据处理架构从MapReduce到Flink的重构。目前在阿里计算平台事业部,专注于基于Flink的一站式计…

Java通过ftl模板导出word最详细教程

首先用office建一个word文档 参数写自己查询出来的字段,我在这里房里图片是方便找到位置替换为64位编码 模板创建好之后,另存为Word 2003 XML文档(*.xml) 存储为别的可能会报错,我只用这一种 存储为xml之后千万不要用word打开,最…