画图板

#功能分析
我们要实现一个画图板,首先从最简单的开始。第一步,实现基本图形的绘制,例如,鼠标点两下或按下拖动释放,可以画一条直线或矩形;第二步,适当添加几个按钮,按下按钮后可以绘制对应的图形,实现简单的选择功能;第三步,添加几种颜色以供选择。至于后面,可以根据自己的兴趣爱好添加相应的功能,甚至可以做下画图板的布局美化工作。我们注意到,绘制的图形要靠鼠标来控制绘制图形的各类、形状、颜色等,这就需要用到鼠标事件监听器(MouseListener)、动作事件监听器(ActionListener)。
#如何显示
创建一个JFrame界面,设置可视。
#如何让程序使用鼠标
给JFrame添加我们要实现画图功能所需要的监听器。
动作事件监听器(MouseListener),其中有一个actionPerformed的方法,在画图板中,可以将鼠标监听器对象添加给一个按钮,当按钮被点击时,按钮就会调用所有监听器actionPerformed方法。在本例中,我们可以获得按钮里的文字,如直线、三角形,以供我们选择画什么图形;可以获得按钮对象,如btn1、btn2;可以获得按钮背景颜色,用作颜色选择。
鼠标事件监听器(MouseListener),其中的方法有mousePressed(鼠标按下)、mouseReleased(鼠标释放)、mouseClicked(鼠标点击)、mouseEntered(鼠标进入)、mouseExited(鼠标离开)
#如何绘制
Graphics对象必须从绘制的容器上获取,即从JFrame界面上获取,JFrame类提供了一个getGraphics()方法得到画布对象。

窗体界面

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Draw1 {
	public static void main(String[]args){
		Draw1 draw=new Draw1();
		draw.show();
	}
	//构造一个窗体对象
	public void show(){
		JFrame jf=new JFrame();
		jf.setTitle("画图板");//标题
		jf.setSize(800,600);//界面大小
		jf.setResizable(false);//界面不可改变大小
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭时退出程序
		//设置窗体布局
		jf.setLocationRelativeTo(null);
		FlowLayout bl=new FlowLayout();
		jf.setLayout(bl);
		
		//创建按钮
		JButton btn1=new JButton("直线");
		JButton btn2=new JButton("矩形");
		JButton btn3=new JButton("三角形");
		JButton btn4=new JButton("多边形");
		JButton color1=new JButton();
		JButton color2=new JButton();
		JButton color3=new JButton();
		color1.setBackground(Color.BLACK);
		color2.setBackground(Color.BLUE);
		color3.setBackground(Color.RED);
		Dimension coldim=new Dimension(40,30);
		color1.setPreferredSize(coldim);
		color2.setPreferredSize(coldim);
		color3.setPreferredSize(coldim);

		//添加到窗体上
		jf.add(btn1);
		jf.add(btn2);
		jf.add(btn3);
		jf.add(btn4);
		jf.add(color1);
		jf.add(color2);
		jf.add(color3);		
	
		//设置可视
		jf.setVisible(true);
		
		//获取画布对象,获取在窗所占的区域
		Graphics g=jf.getGraphics();
		
		//创建监听器并将画笔对象传给监听器对象
		DrawListener1 dlis=new DrawListener1(g);

		//加上监听器
		jf.addMouseListener(dlis);
		btn1.addActionListener(dlis);
		btn2.addActionListener(dlis);
		btn3.addActionListener(dlis);
		btn4.addActionListener(dlis);
		color1.addActionListener(dlis);
		color2.addActionListener(dlis);
		color3.addActionListener(dlis);
	}

}

监听器

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;

public class DrawListener1 implements ActionListener, MouseListener{
	private int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5;
	private String name;
	private Graphics g;
	
	public DrawListener1(Graphics g) {
		this.g = g;
	}

	public void actionPerformed(ActionEvent e) {
		//获取按钮上的颜色
		if ("".equals(e.getActionCommand())) {
			JButton button = (JButton) e.getSource();
			Color color = button.getBackground();
			g.setColor(color);
		} 
		else {
			//获取按钮上的字符串
			name = e.getActionCommand();
		}	
	}

	//获取坐标
	public void mousePressed(MouseEvent e) {
		x1 = e.getX();
		y1 = e.getY();
	}

	public void mouseReleased(MouseEvent e) {
		
		//画直线
		if ("直线".equals(name)) {
			x2 = e.getX();
			y2 = e.getY();
			g.drawLine(x1, y1, x2, y2);
			
		//画矩形	
		} else if ("矩形".equals(name)) {
			x2 = e.getX();
			y2 = e.getY();
			g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));
		}
	}

	int n = 0;
	public void mouseClicked(MouseEvent e) {
		
		//画三角形
		if ("三角形".equals(name)) {
			if (n == 0) {
				x3 = e.getX();
				y3 = e.getY();
				g.drawLine(x3, y3, x3, y3);
				n++;
			} 
			else if (n == 1) {
				x4 = e.getX();
				y4 = e.getY();
				g.drawLine(x3, y3, x4, y4);
				n++;
			} 
			else if (n == 2) {
				x5 = e.getX();
				y5 = e.getY();
				g.drawLine(x3, y3, x5, y5);
				g.drawLine(x4, y4, x5, y5);
				n = 0;
			}
		} 
		
		//画多边形
		else if ("多边形".equals(name)) {
			if (n == 0) {
				x3 = e.getX();
				y3 = e.getY();
				g.drawLine(x3, y3, x3, y3);
				n++;
			} 
			else if (n == 1) {
				x4 = e.getX();
				y4 = e.getY();
				g.drawLine(x3, y3, x4, y4);
				n++;
			}
			else if (n == 2) {
			//鼠标左键不断获取点
				if (e.getButton() == 1) {
					x5 = e.getX();
					y5 = e.getY();
					g.drawLine(x4, y4, x5, y5);
					x4 = x5;
					y4 = y5;
				} 
				//鼠标右键多边形首尾相连
				else if (e.getButton() == 3) {
					g.drawLine(x5, y5, x3, y3);
					n = 0;
				}
			}
		}
	}

	public void mouseEntered(MouseEvent e) {

	}

	public void mouseExited(MouseEvent e) {

	}
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值