JavaSE20—绘图

JavaSE20—绘图

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);
    }
}

你可能感兴趣的:(swing)