JavaSE20—绘图
1. 绘制图形
Graphics类是所有图形上下文的抽象基类,它允许应用程序在组建以及闭屏图像上进行绘制。
Graphics类提供了绘图常用的方法,利用这些方法可以实现之线,矩形,多边形,椭圆,圆弧等形状的文本,图片的绘制操作。
Graphics2D类可以完成简单的图形绘制任务,该类继承自Graphics。
Graphics2D类是推荐使用的绘图类,具有更强大的功能,要绘制指定形状的图形,需要先创建并初始化该图形类的对象,这些图形类必须是Shape接口的实现类,然后使用Graphics2D类的draw()方法绘制图形对象或使用fill()方法填充对象
实例:在窗体中创建用于绘制图形的成员内部类,该内部类继承自JPanel类成为面板类,并使用Graphics2D类绘制图形。
1) 绘图颜色的设置
使用Color类可以创建任何颜色的对象,而不用担心不同平台对改颜色是否支持。
创建Color对象的构造方法:
Color(int r,int g,int b);
绘图类可以使用setColor()方法设置当前颜色,使用绘图类的setColor()方法设置当前颜色:
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.BLUE);
Rectangle2D rect = new Rectangle2D.Double(25,25,70,70);
g2.draw(rect);
}
2) 设置画笔属性
默认情况下,使用的画笔属性是粗细为1个像素的正方形,而Java2D的Graphics2D类可以调用setStock()方法设置壁画的属性。
3. 绘制文本
1) 设置字体,字号和字形
在Java.awt中提供了Font类,该类封装了字体名称,字号和样式等属性。
Font(String name,int style,int size)
设置绘图类的字体可以使用绘图类的setFont()方法。
2) 显示文本内容
Graphics2D类提供了drawString()方法,使用该方法可以在图像上下文中绘制文本内容。
实例:在项目中创建DrawString类,绘制唐诗
使用Graphics2D类的drawImage()方法可以在绘图上下文中绘制图像
该方法的使用与绘制文本drawString()方法类似,唯一不同的是drawImage()方法需要指定通知的图像观察者。
实例:绘制图像
简单画图程序:
DrawPicCanvas.java:
1. 绘制图形
Graphics类是所有图形上下文的抽象基类,它允许应用程序在组建以及闭屏图像上进行绘制。
Graphics类提供了绘图常用的方法,利用这些方法可以实现之线,矩形,多边形,椭圆,圆弧等形状的文本,图片的绘制操作。
Graphics2D类可以完成简单的图形绘制任务,该类继承自Graphics。
Graphics2D类是推荐使用的绘图类,具有更强大的功能,要绘制指定形状的图形,需要先创建并初始化该图形类的对象,这些图形类必须是Shape接口的实现类,然后使用Graphics2D类的draw()方法绘制图形对象或使用fill()方法填充对象
实例:在窗体中创建用于绘制图形的成员内部类,该内部类继承自JPanel类成为面板类,并使用Graphics2D类绘制图形。
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; public class DrawGraphics2DDemo extends JFrame { public DrawGraphics2DDemo(){ super(); ini(); } private void ini() { // TODO Auto-generated method stub this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(new CanvasPanel()); this.setTitle("绘图实例"); } public static void main(String[] args){ new DrawGraphics2DDemo().setVisible(true); } // class CanvasPanel extends JPanel{ public void paint(Graphics g){ super.paint(g); Graphics2D g2 = (Graphics2D) g; Shape[] shapes = new Shape[4]; shapes[0] = new Rectangle2D.Float(25,25,70,70); shapes[1] = new Rectangle2D.Float(130,10,100,100); shapes[2] = new Ellipse2D.Float(130,10,100,100); shapes[3] = new Ellipse2D.Float(10,10,100,100); for(int i=0;i<shapes.length;i++){ if(i%2==0) g2.fill(shapes[i]); else g2.draw(shapes[i]); } } } }2. 绘图颜色与画笔
1) 绘图颜色的设置
使用Color类可以创建任何颜色的对象,而不用担心不同平台对改颜色是否支持。
创建Color对象的构造方法:
Color(int r,int g,int b);
绘图类可以使用setColor()方法设置当前颜色,使用绘图类的setColor()方法设置当前颜色:
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.BLUE);
Rectangle2D rect = new Rectangle2D.Double(25,25,70,70);
g2.draw(rect);
}
2) 设置画笔属性
默认情况下,使用的画笔属性是粗细为1个像素的正方形,而Java2D的Graphics2D类可以调用setStock()方法设置壁画的属性。
3. 绘制文本
1) 设置字体,字号和字形
在Java.awt中提供了Font类,该类封装了字体名称,字号和样式等属性。
Font(String name,int style,int size)
设置绘图类的字体可以使用绘图类的setFont()方法。
2) 显示文本内容
Graphics2D类提供了drawString()方法,使用该方法可以在图像上下文中绘制文本内容。
实例:在项目中创建DrawString类,绘制唐诗
import java.awt.Canvas; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JFrame; public class DrawStringDemo extends JFrame { public DrawStringDemo(){ this.setSize(260,180); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add(new CanvasPanel()); this.setTitle("DrawStringDemo"); } public static void main(String[] args){ new DrawStringDemo().setVisible(true); } class CanvasPanel extends Canvas{ public void paint(Graphics g){ super.paint(g); Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.BLUE); Font font = new Font("宋体",Font.BOLD,24); g2.setFont(font); g2.drawString("静夜思", 80, 40); font = new Font("宋体",Font.BOLD|Font.ITALIC,18); g2.setFont(font); g2.drawString("李白", 130, 70); font = new Font("宋体",Font.PLAIN,14); g2.setFont(font); g2.drawString("床前明月光", 40, 100); g2.drawString("疑是地上霜", 120, 100); g2.drawString("举头望明月",40,120); g2.drawString("低头思故乡", 120, 120); } } }4. 绘制图像
使用Graphics2D类的drawImage()方法可以在绘图上下文中绘制图像
该方法的使用与绘制文本drawString()方法类似,唯一不同的是drawImage()方法需要指定通知的图像观察者。
实例:绘制图像
import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.net.URL; import javax.swing.JFrame; import javax.swing.JPanel; public class DrawImageDemo extends JFrame { private Image img = null; private JPanel contentPanel = null; private Canvas canvas = null; public DrawImageDemo(){ initialize(); } private void initialize() { // TODO Auto-generated method stub URL imgUrl = DrawImageDemo.class.getResource("/img/愤怒的小鸟.jpg"); img = Toolkit.getDefaultToolkit().getImage(imgUrl); canvas = new CanvasPanel(); this.setBounds(200,160,440,639); this.setContentPane(getContentPanel()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("DrawImageDemo"); this.setVisible(true); } private JPanel getContentPanel(){ if(contentPanel == null){ contentPanel = new JPanel(); contentPanel.setLayout(new BorderLayout()); contentPanel.add(canvas,BorderLayout.CENTER); canvas.repaint(); } return contentPanel; } public static void main(String[] args){ new DrawImageDemo(); } class CanvasPanel extends Canvas { public void paint(Graphics g){ g.drawImage(img, 0,0,this); } } }
简单画图程序:
DrawPicCanvas.java:
import java.awt.Canvas; import java.awt.Graphics; import java.awt.Image; @SuppressWarnings("serial") public class DrawPicCanvas extends Canvas{ //定义Image对象的引用 private Image img = null; public DrawPicCanvas(){ super(); } public void setImg(Image img) { this.img = img; } //重写paint方法 public void paint(Graphics g){ g.drawImage(img,0,0,null);//画布上绘图 } //解决屏幕闪烁 public void update(Graphics g){ paint(g); } }DrawPicFrame.java:
import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.image.BufferedImage; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JFrame; import javax.swing.JToolBar; import javax.swing.UIManager; import javax.swing.WindowConstants; public class DrawPicFrame extends JFrame { // 创建图像对象 BufferedImage image = new BufferedImage(570, 390, BufferedImage.TYPE_INT_BGR); Graphics gs = image.getGraphics(); // 获得图像的绘图上下文对象 Graphics2D g = (Graphics2D) gs; // 将绘图上下文对象转换为Graphics2D类型 DrawPicCanvas canvas = new DrawPicCanvas(); // 创建画布对象 Color foreColor = Color.BLUE; // 定义前景色 Color backgroundColor = Color.WHITE; // 定义背景色 boolean rubber = false; // 橡皮标识变量 int x = -1; // 上一次鼠标绘制点的横坐标 int y = -1; // 上一次鼠标绘制点的纵坐标 public DrawPicFrame() { super(); setTitle("简易画图程序"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setBounds(100, 80, 574, 397); g.setColor(backgroundColor); // 用背景色设置绘图上下文对象的颜色 g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布 g.setColor(foreColor); // 用前景色设置绘图上下文对象的颜色 canvas.setImg(image); // 设置画布的图像 getContentPane().add(canvas); // 将画布添加到窗体容器默认布局的中部位置 canvas.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(final MouseEvent e) { if (rubber) { // 橡皮标识为true,表示使用橡皮 if (x > 0 && y > 0) { g.setColor(backgroundColor); // 用背景色设置绘图上下文对象的颜色 g.fillRect(x, y, 10, 10); // 擦除鼠标经过位置的图像 } x = e.getX(); // 获得鼠标在画布上的横坐标 y = e.getY(); // 获得鼠标在画布上的纵坐标 } else { // 橡皮标识为false,表示画图 if (x > 0 && y > 0) { // 在鼠标经过处画直线 g.drawLine(x, y, e.getX(), e.getY()); } x = e.getX(); // 上一次鼠标绘制点的横坐标 y = e.getY(); // 上一次鼠标绘制点的纵坐标 } canvas.repaint(); // 更新画布 } public void mouseMoved(final MouseEvent arg0) { if (rubber) { // 设置鼠标指针的形状 setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } else { // 设置鼠标指针的形状 setCursor(Cursor .getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); } } }); canvas.addMouseListener(new MouseAdapter() { public void mouseReleased(final MouseEvent arg0) { x = -1; // 上一次鼠标绘制点的横坐标 y = -1; // 上一次鼠标绘制点的纵坐标 } }); final JToolBar toolBar = new JToolBar(); toolBar.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(final MouseEvent arg0) { // 设置鼠标指针的形状 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } }); getContentPane().add(toolBar, BorderLayout.NORTH); final JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { // 声明画笔的属性,粗细为1像素 BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); g.setStroke(bs); // 设置绘图上下文对象的画笔 } }); button.setText(" 细 线 "); toolBar.add(button); final JButton button_1 = new JButton(); button_1.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { // 声明画笔的属性,粗细为2像素 BasicStroke bs = new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); g.setStroke(bs); // 设置绘图上下文对象的画笔 } }); button_1.setText(" 粗 线 "); toolBar.add(button_1); final JButton button_2 = new JButton(); button_2.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { // 声明画笔的属性,粗细为4像素 BasicStroke bs = new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); g.setStroke(bs); // 设置绘图上下文对象的画笔 } }); button_2.setText(" 较 粗 "); toolBar.add(button_2); final JButton button_3 = new JButton(); button_3.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { // 打开选择颜色对话框 Color bgColor = JColorChooser.showDialog(null, "选择颜色对话框", Color.CYAN); if (bgColor != null) { backgroundColor = bgColor; } g.setColor(backgroundColor); // 设置绘图上下文对象的背景色 g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布 g.setColor(foreColor); // 设置绘图上下文对象的前景色 canvas.repaint(); // 更新画布 } }); button_3.setText("背景颜色"); toolBar.add(button_3); final JButton button_4 = new JButton(); button_4.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { // 打开选择颜色对话框 Color fColor = JColorChooser.showDialog(null, "选择颜色对话框", Color.CYAN); if (fColor != null) { foreColor = fColor; } g.setColor(foreColor); // 设置绘图上下文对象的前景色 } }); button_4.setText("前景颜色"); toolBar.add(button_4); final JButton button_5 = new JButton(); button_5.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { g.setColor(backgroundColor); // 设置绘图上下文对象的背景色 g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布 g.setColor(foreColor); // 设置绘图上下文对象的前景色 canvas.repaint(); // 更新画布 } }); button_5.setText(" 清 除 "); toolBar.add(button_5); final JButton button_6 = new JButton(); button_6.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { if (button_6.getText().equals(" 橡 皮 ")) { // 单击工具栏上的橡皮按钮,使用橡皮 rubber = true; // 设置橡皮标识为true button_6.setText(" 画 图 "); // 改变按钮上显示的文本为画图 } else { // 单击工具栏上的画图按钮,使用画笔 rubber = false; // 设置橡皮标识为false button_6.setText(" 橡 皮 "); // 改变按钮上显示的文本为橡皮 } } }); button_6.setText(" 橡 皮 "); toolBar.add(button_6); final JButton button_7 = new JButton(); button_7.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent arg0) { System.exit(0); // 退出应用程序 } }); button_7.setText(" 退 出 "); toolBar.add(button_7); } public static void main(String[] args) { try { UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); } catch (Throwable e) { } DrawPicFrame frame = new DrawPicFrame(); frame.setVisible(true); } }
发表评论
-
JavaSE19—Swing高级控件(下)
2011-05-15 17:28 1087JavaSE19—Swing高级控件(下) 1. 工具栏与对话 ... -
JavaSE18—Swing高级控件(上)
2011-05-12 22:22 1497JavaSE18—Swing高级控件(上) 1. 为窗体添加 ... -
JavaSE17—GUI事件
2011-05-08 20:52 1041JavaSE17—GUI事件处理机 ... -
JavaSE15—多线程
2011-05-03 19:10 828JavaSE15—多线程 1. 多线程简介 程序:程序是计算 ... -
JavaSE14—窗体程序开发(下)
2011-05-01 16:55 968JavaSE14—窗体程序开发(下) 1. 基础组件(续) ... -
JavaSE13—窗体程序开发(中)
2011-05-01 16:53 1131JavaSE13—窗体程序开发(中) 1、 布局方式 1) ... -
JavaSE12—窗体程序开发(上)
2011-04-29 16:59 1465JavaSE12—窗体程序开发 ... -
JavaSE11—网络编程初步
2011-04-29 16:58 937JavaSE11—网络编程初步 1. 背景知识 1) 端口 ... -
JavaSE 10 —IO流
2011-04-28 20:00 863JavaSE 10 —IO流 1.IO流简介 Java的输入 ... -
JavaSE09—Java类集框架
2011-04-26 19:32 834JavaSE09—Java类集框架 1. 类集接口 接口: ... -
JavaSE08—包,访问权限及异常处理
2011-04-26 19:31 630JavaSE08—包,访问权限 ... -
JavaSE07—Java常用类库
2011-04-26 19:30 627JavaSE07—Java常用类库 1. String类和S ... -
JavaSE06—类的其他问题
2011-04-26 19:28 664JavaSE06—类的其他问题 1. Objec ... -
JavaSE05—抽象类与接口
2011-04-26 19:27 620JavaSE05—抽象类与接口 1. ... -
JavaSE04—类的封装,继承与多态
2011-04-26 19:26 683JavaSE04—类的封装,继 ... -
JavaSE03—类和对象
2011-04-26 19:24 627JavaSE03—类和对象 1. ... -
Java SE02——数组
2011-04-26 19:23 628Java SE02——数组 1. 数组的声 ... -
Java SE01——原生数据类型
2011-04-26 19:18 831Java SE01——原生数据类型 1.Java中的数据类 ...
相关推荐
JavaSE基本知识 适合新手入门 JavaSE基本知识 适合新手入门 JavaSE基本知识 适合新手入门
javaSE
JAVASE阶段经典笔试题20道,对于javaSE的初学者不妨看一看!
JavaSE 1.6 参考文档 JavaSE 1.6 API
javaSE
赠送jar包:javase-2.2.jar; 赠送原API文档:javase-2.2-javadoc.jar; 赠送源代码:javase-2.2-sources.jar; 赠送Maven依赖信息文件:javase-2.2.pom; 包含翻译后的API文档:javase-2.2-javadoc-API文档-中文...
JavaSE的编程资料,包括基础,集合框架,IO流等等
javase脑图.emmx
JavaSE李学重讲义
JAVASE基础知识详解
学习JavaSE的全面的课件学习JavaSE的全面的课件学习JavaSE的全面的课件学习JavaSE的全面的课件学习JavaSE的全面的课件学习JavaSE的全面的课件学习JavaSE的全面的课件学习JavaSE的全面的课件学习JavaSE的全面的课件...
JavaSE基础.md
赠送jar包:javase-3.3.3.jar; 赠送原API文档:javase-3.3.3-javadoc.jar; 赠送源代码:javase-3.3.3-sources.jar; 赠送Maven依赖信息文件:javase-3.3.3.pom; 包含翻译后的API文档:javase-3.3.3-javadoc-API...
正在自学黑马程序员Java全套,目前只学了Javase,接下来是Javaweb,把自己整理的笔记分享一下。
JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释 。
JavaSE总结.xmind
王道JavaSE阶段测试仅供参考,合理利用,对自己进行阶段性的测试,查漏补缺
自己的一些 javase的笔记自己的一些 javase的笔记自己的一些 javase的笔记自己的一些 javase的笔记自己的一些 javase的笔记自己的一些 javase的笔记自己的一些 javase的笔记自己的一些 javase的笔记自己的一些 ...
三年JavaEE开发积累的那些代码之一:JavaSE篇 有什么? 1)自己写的例子:或是为了项目中应用写的demo,或是为了学习某项技术写的demo。 2)网上下载的例子:或改过或没改过,或完善过或原封没动。 没什么? 1)公司...
传智播客 付东 javase笔记 javase的简单总结 框架