Java基础学习之画板1

一、步骤:

1、画板分块:菜单栏、画板左侧、画板中部、画板下部

2、分别在画板左侧、画板中部、画板下部添加JPanel,因为JFrame默认布局是BorderLayout布局,所以可以不写

3、画板左侧有16个单选按钮,用JRadioButton,还要将它们添加到ButtonGroup中

4、画板中部再添加一个白色JPanel

5、画板下部的左边添加一个JPanel(布局用FlowLayout,左对齐,横纵间隙均为0),再在这个JPanel上添加一左(小)一右(大)两个JPanel,在小JPanel上添加两个部分重叠的JButton(布局绝对布局即null),大JPanel上添加28个JButton(布局为FlowLayout,左对齐,横纵间隙均为0)

6、菜单栏部分使用的组件有JMenuBar、JMenu、JMenuItem、JCheckBoxItem分析图如下:


二、类的分析:

1、首先要有一个窗体,所以要有一个显示窗体的类DrawBoard

2、画出图形,则涉及到鼠标事件,所以需要一个鼠标监听器类DrawListener,实现MouseListener、MouseMotionListener接口

3、颜色按钮(JButton)改变画笔的颜色,涉及到ActionEvent事件,所以需要一个颜色监听器类ColorListener

4、需要测试类(入口)

三、直线、矩形、圆角矩形、铅笔、橡皮擦、喷桶、刷子、多边形、椭圆、取色器的画法实现:

1、直线:

分析:画直线需要两个点,鼠标按下,记录一个点;鼠标释放,记录一个点,然后

g.drawLine(x1,y1,x2,y2);
直线就画好啦!是不是很简单?

2、矩形:

分析:我们画矩形时,可以由四个方向(左上往右下、右下往左上、右上往左下、左下往右上),但是不管我们怎么画左上角的点总是最小的,同样是鼠标按下,记录一个点;鼠标释放,记录一个点,所以

g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
					Math.abs(y1 - y2));
矩形也画好啦!

3、圆角矩形:和矩形差不多,只是圆角矩形的四个角多了弧度值(可以自己设置)罢了,这里就不详细讲了

4、椭圆:是矩形的内接圆,和矩形差不多

g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
					Math.abs(y1 - y2));
就可以了

5、铅笔:

分析:多条线段组成,动作分为鼠标按下(记录一个点)、鼠标拖动(记录一个点),记住在mouseDragged(MouseEvent e)里面写

g.drawLine(x1, y1, x2, y2);
铅笔也完成了

6、刷子:

其实就是铅笔变粗了。这里原本我们画笔用的类是Graphics,现在强制转换为Graphics2D

Graphics g = panelWhite.getGraphics();
Graphics2D g2 = (Graphics2D) g;
然后传值到DrawListener类里就可以改变粗细了
g.setStroke(new BasicStroke((float) 10.0));
g.drawLine(x1, y1, x2, y2);
注意:这里画笔的粗细改变了,如果画其他图形也会变成这么粗的线条,怎么办呢?

我们可以在鼠标按下的时候设置线条默认粗细

// 设置粗细
g.setStroke(new BasicStroke((float) 1.0));
相当于说,画完一个图形,就将这支笔放下,再画下一个图形时,再拿一支笔。为什么不在释放的时候写这段代码呢?这是因为画铅笔等不需要释放,但是画所有图形都需要按下

7、橡皮擦:

其实也是铅笔的颜色是白色和线条变粗了而已

g.setStroke(new BasicStroke((float) 10.0));
g.setColor(Color.white);
同样在鼠标按下时设置默认颜色
g.setColor(color);
8、喷桶

分析:相当于以一个点为圆心,半径自定义的一个圆(以点构成的),就是一个点有x增量,y增量,可以用Random类实现随机范围(-15到15)

public Random r = new Random();
for (int i = 0; i < 50; i++) {
        int a = r.nextInt(31) - 15;
	int b = r.nextInt(31) - 15;
	// 以点为半径
	g.drawLine(x2 + a, y2 + b, x2 + a, y2 + b);
}
9、多边形

分析:鼠标按下,记录一个点;鼠标释放记录一个点,连线。以上一次释放的点为起点,当前释放的点为终点,连线。最后双击,将鼠标第一次按下的点和最终释放的点连起来。怎么画呢?设置一个boolean类型的标记变量

public boolean flag = true;
然后
if (flag) {

	// 第一根线段
	g.drawLine(x1, y1, x2, y2);

	
	// 保存第一次按下的坐标
	x3 = x1;
	y3 = y1;

	// flag改变
	flag = false;
} 
else {
	g.drawLine(x4, y4, x2, y2);			
}
x4 = x2;//将上一次释放的点赋给另一个变量
y4 = y2;
点击操作:
if (e.getClickCount() == 2) {
	g.drawLine(x2, y2, x3, y3);
	// flag恢复默认true
	flag = true;
}
这样多边形也绘制完了

10、取色器:用Robot类

分析:点击,截图,取色

// 取坐标,相对于屏幕的坐标,不然有错
x2 = e.getXOnScreen();
y2 = e.getYOnScreen();

// 截图
try {
	Robot robot = new Robot();

	// 默认一个像素的宽高都是1
	BufferedImage image = robot.createScreenCapture(new Rectangle(
			x2, y2, 1, 1));

	// 截取的一块矩形只有一个像素点,所以坐标是(0,0)
	color = new Color(image.getRGB(0, 0));
} catch (AWTException e1) {
	e1.printStackTrace();
}
这样取色器也做好了

下面我们来测试一下:(效果还是不错的)

四、颜色按钮的实现

1、颜色监听器ColorListener

2、传值问题(非常难):

1)首先我们要明白颜色给谁用?当然是给DrawListener类画图用啦!

2)DrawListener类的对象已经是DrawBoard类里的全局变量了,这个全局变量(对象)就可以访问DrawListener类里的color变量,所以我们只要在ColorListener类里定义DrawListener类的对象。

public DrawBoard db;
ColorListener就拿到了 DrawBoard的对象,就可以访问DrawBoard的全局变量
db.listener.color = color;
这样 ColorListener就将color传给了DrawListener

3、可以用TakeColor得到精确的颜色的int值

这样颜色按钮也做好了。效果:

5、这样在我们改变窗体大小时,我们画的图像也都消失了,这是为什么呢?

这就涉及到电脑的缓存了,我们在屏幕上看到的的是缓存中存储的,是暂时存储的,一旦缩小窗体,关于窗体的东西全部从缓存中清空,放大窗体时,又将这些东西从内存中调出来,有一个paint方法会将窗体中的东西重绘,但是所画的图像并没有重绘,这就导致了图像的消失。怎么办呢?

我们可以重写paint方法来实现,这就涉及到队列了。点、粗细、颜色等都需重绘,这些下次再记录了(我的代码中也实现了一些,但是很多都没有实现,下次多多努力了)

下面是代码:窗体类:

package com.test.lesson5;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.BevelBorder;

/**
 * @liang
 */
/********* 窗体 **********/
public class DrawBoard extends JFrame {
	public ColorListener action;
	public DrawListener listener;
	public JButton jbt1;
	// 队列用于存放所绘画的图形
	ArrayList<Integer> list = new ArrayList<Integer>();
	public Graphics2D g2;

	// Color color;

	/********* 初始化 **********/
	public void init() {

		/********* 窗体属性 **********/
		this.setSize(600, 600);
		this.setTitle("DrawBoard");
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);

		/********* 菜单 **********/
		JMenuBar menubar = new JMenuBar();
		// 菜单条的边框为凸起
		menubar.setBorder(new BevelBorder(0));
		menubar.setBackground(new Color(245, 246, 247));
		// 菜单
		JMenu[] jm = new JMenu[7];
		String[] st = { "文件(F)", "编辑(E)", "查看(V)", "图像(I)", "颜色(C)", "帮助(H)",
				"缩放(Z)" };
		for (int i = 0; i < jm.length; i++) {
			jm[i] = new JMenu(st[i]);
			// 设置菜单字体、样式、字号
			jm[i].setFont(new Font("TimesRoman", Font.PLAIN, 13));
			if (i != 6) {
				menubar.add(jm[i]);
			}
		}
		String[] a = { "新建(N)", "打开(O)", "保存(S)", "另存为(A)", "从扫描仪或照相机(C)",
				"打印预览(V)", "页面设置(U)", "打印(P)", "发送(E)", "设置为墙纸(平铺)(B)",
				"设置为墙纸(居中)(K)", "最近使用过得文件", "退出(X)", "撤销(U)", "重复(R)", "剪切(T)",
				"复制(C)", "粘贴(P)", "清除选定内容(L)", "全选(A)", "复制到(O)", "粘贴来源(F)",
				"翻转/旋转(F)", "拉伸/扭曲(S)", "反色(I)", "属性(A)", "清除图像(C)", "编辑颜色(E)",
				"帮助主题(H)", "关于画图(A)", "文字工具栏(E)", "查看位图(V)", "常规尺寸(N)",
				"大尺寸(L)", "自定义(U)", "显示网络(G)", "显示缩略图(H)" };

		// 复选菜单项
		JCheckBoxMenuItem[] box = new JCheckBoxMenuItem[4];
		String[] b = { "工具箱(T)", "颜料盒(C)", "状态栏(S)", "不透明处理(D)" };
		for (int i = 0; i < box.length; i++) {
			box[i] = new JCheckBoxMenuItem(b[i]);
			box[i].setFont(new Font("Courier", Font.PLAIN, 13));
			jm[2].add(box[i]);
		}

		// 菜单项
		JMenuItem[] jmi = new JMenuItem[37];
		for (int i = 0; i < jmi.length; i++) {
			jmi[i] = new JMenuItem(a[i]);
			jmi[i].setFont(new Font("Courier", Font.PLAIN, 13));
			if (i < 13) {
				jm[0].add(jmi[i]);
			} else if (i >= 13 && i < 22) {
				jm[1].add(jmi[i]);
			} else if (i >= 22 && i < 27) {
				jm[3].add(jmi[i]);
			} else if (i == 27) {
				jm[4].add(jmi[i]);
			} else if (i > 27 && i < 30) {
				jm[5].add(jmi[i]);
			} else if (i == 30) {
				jm[2].add(jmi[i]);
			}
		}
		jm[2].add(jm[6]);
		jm[2].add(jmi[31]);
		for (int i = 32; i < jmi.length; i++) {
			jm[6].add(jmi[i]);
		}
		jm[3].add(box[3]);

		// 将菜单条放到窗体中
		this.setJMenuBar(menubar);

		/********* 三个面板分布左中下 **********/
		JPanel panelLeft = new JPanel();
		JPanel panelDown = new JPanel();
		JPanel panelCenter = new JPanel();

		// setSize方法只能用于窗体设置大小,其他设置大小均用setPreferredSize方法
		panelLeft.setPreferredSize(new Dimension(50, 100));
		panelLeft.setBackground(new Color(240, 240, 240));
		panelLeft.setLayout(new FlowLayout(0, 0, 0));
		this.add(panelLeft, BorderLayout.WEST);

		panelDown.setPreferredSize(new Dimension(600, 58));
		panelDown.setBackground(new Color(235, 235, 235));
		panelDown.setLayout(new FlowLayout(0, 0, 0));
		this.add(panelDown, BorderLayout.SOUTH);

		// 设置panelCenter的边框特效
		panelCenter.setBorder(new BevelBorder(1, Color.white, Color.gray));
		panelCenter.setBackground(new Color(171, 171, 171));
		panelCenter.setLayout(new FlowLayout(0, 0, 0));
		this.add(panelCenter);

		/********* 中间面板上再放一个白色面板 **********/
		JPanel panelWhite = new JPanel();
		panelWhite.setBorder(new BevelBorder(1, Color.white, Color.gray));
		panelWhite.setBackground(Color.white);
		panelWhite.setPreferredSize(new Dimension(400, 400));
		panelCenter.add(panelWhite);

		// 窗体左边上面添加一个面板
		JPanel panelU = new JPanel();
		panelU.setPreferredSize(new Dimension(50, 30));
		panelU.setBackground(new Color(240, 240, 240));
		panelLeft.add(panelU);

		/********* 窗体左边放置JRadioButton **********/
		ButtonGroup bg = new ButtonGroup();
		for (int i = 0; i < 16; i++) {
			JRadioButton jrb = new JRadioButton();
			/*************** 默认选中铅笔 ********************/
			if (i == 6) {
				jrb.setSelected(true);
			}
			/********************** 给JRadioButton添加图片 ****************************/
			jrb.setIcon(new ImageIcon("Image/draw" + i + ".jpg"));
			jrb.setRolloverIcon(new ImageIcon("Image/draw" + i + "-1.jpg"));
			jrb.setPressedIcon(new ImageIcon("Image/draw" + i + "-2.jpg"));
			jrb.setSelectedIcon(new ImageIcon("Image/draw" + i + "-3.jpg"));

			/******************** 给JRadioButton添加命令 **********************/
			jrb.setActionCommand("tuxing" + i);

			/******************** 给JRadioButton无 边界 **********************/
			jrb.setBorder(null);

			bg.add(jrb);
			panelLeft.add(jrb);
		}

		/******************** 设置凹下去 **********************/
		BevelBorder border = new BevelBorder(1, Color.white, Color.gray);

		// 窗体左边JRadioButton下面添加一个面板
		JPanel panelP = new JPanel();
		panelP.setPreferredSize(new Dimension(50, 70));
		panelLeft.add(panelP);

		JPanel panelA = new JPanel();
		panelA.setPreferredSize(new Dimension(40, 70));
		panelA.setBackground(new Color(240, 240, 240));
		panelA.setBorder(border);
		panelP.add(panelA);

		/********* 窗体南面的上面放置一个面板 **********/
		JPanel panelS = new JPanel();
		panelS.setPreferredSize(new Dimension(600, 38));
		panelS.setLayout(new FlowLayout(0, 0, 8));
		panelDown.add(panelS);

		/********* 窗体南面的下面放置一个面板 **********/
		JPanel panelX = new JPanel();
		panelX.setBorder(border);
		panelX.setPreferredSize(new Dimension(600, 20));
		panelX.setLayout(new FlowLayout(0, 0, 0));
		panelDown.add(panelX);

		/********* 窗体南面的下面放置一个标签 **********/
		JLabel jl = new JLabel("要获得帮助,请在”帮助“菜单中,单击“帮助主题。");
		jl.setFont(new Font("Courier", Font.PLAIN, 13));
		jl.setBackground(new Color(240, 240, 240));
		panelX.add(jl);

		/********* 窗体南面的左边再放置一个面板 **********/
		JPanel panelDownL = new JPanel();
		panelDownL.setPreferredSize(new Dimension(240, 30));
		panelDownL.setLayout(new FlowLayout(0, 0, 0));
		panelS.add(panelDownL);

		/********* 窗体南面的左边面板上再放置一个面板 **********/
		JPanel panelx = new JPanel();

		panelx.setPreferredSize(new Dimension(30, 30));
		panelx.setBackground(new Color(245, 245, 245));
		panelx.setLayout(null);
		panelx.setBorder(border);
		panelDownL.add(panelx);

		/********* 新面板上添加两个重叠的JButton **********/
		jbt1 = new JButton();
		jbt1.setBounds(5, 5, 15, 15);
		jbt1.setBorder(border);
		jbt1.setBackground(Color.black);
		panelx.add(jbt1);

		JButton jbt2 = new JButton();
		jbt2.setBounds(10, 10, 15, 15);
		jbt2.setBackground(Color.white);
		jbt2.setBorder(border);
		panelx.add(jbt2);

		/********* 窗体南面的右边面板上再放置一个面板 **********/
		JPanel paneld = new JPanel();
		paneld.setPreferredSize(new Dimension(210, 30));
		paneld.setLayout(new FlowLayout(0, 0, 0));
		panelDownL.add(paneld);

		/********* 颜色的设置 **********/
		Color[] c = { new Color(0, 0, 0), new Color(128, 128, 128),
				new Color(128, 0, 0), new Color(128, 128, 0),
				new Color(0, 128, 0), new Color(0, 128, 128),
				new Color(0, 0, 128), new Color(128, 0, 128),
				new Color(128, 128, 64), new Color(0, 64, 64),
				new Color(0, 128, 255), new Color(0, 64, 128),
				new Color(128, 0, 255), new Color(128, 64, 0),

				new Color(255, 255, 255), new Color(192, 192, 192),
				new Color(255, 0, 0), new Color(255, 255, 0),
				new Color(0, 255, 0), new Color(0, 255, 255),
				new Color(0, 0, 255), new Color(255, 0, 255),
				new Color(255, 255, 128), new Color(0, 255, 128),
				new Color(128, 255, 255), new Color(128, 128, 255),
				new Color(255, 0, 128), new Color(255, 128, 64) };

		// 给颜色按钮设置监听,this是指当前窗口DrawBoard的对象
		action = new ColorListener(this);

		/*
		 * ActionListener al = new ActionListener() {
		 * 
		 * public void actionPerformed(ActionEvent e) { JButton button =
		 * (JButton) e.getSource(); color = button.getBackground();
		 * listener.color = color; }
		 * 
		 * };
		 */

		/********* 新面板上添加28个JButton **********/
		JButton[] but = new JButton[28];
		for (int i = 0; i < but.length; i++) {
			but[i] = new JButton();
			but[i].setPreferredSize(new Dimension(15, 15));
			but[i].setBorder(border);
			but[i].setBackground(c[i]);
			paneld.add(but[i]);

			// 按钮添加监听
			but[i].addActionListener(action);
			// but[i].addActionListener(al);
		}

		/********* 窗体可见 (窗体可见后才获取画笔) **********/
		this.setVisible(true);

		// 获取画笔
		Graphics g = panelWhite.getGraphics();
		g2 = (Graphics2D) g;
		listener = new DrawListener(g2, bg, list);
		panelWhite.addMouseListener(listener);
		panelWhite.addMouseMotionListener(listener);

	}

	public void paint(Graphics g) {
		super.paint(g);
		for (int i = 0; i < list.size(); i += 7) {
			int flag = list.get(i);
			int flag2 = list.get(i + 1);
			int flag3 = list.get(i + 2);
			int x1 = list.get(i + 3);
			int y1 = list.get(i + 4);
			int x2 = list.get(i + 5);
			int y2 = list.get(i + 6);
			if (flag2 == -1 && flag3 == -3) {
				g2.setStroke(new BasicStroke((float) 1.0));
				g2.setColor(listener.color);
				if (flag == 1) {
					g2.drawLine(x1, y1, x2, y2);
				} else if (flag == 2) {
					g2.drawRect(Math.min(x1, x2), Math.min(y1, y2),
							Math.abs(x1 - x2), Math.abs(y1 - y2));
				} else if (flag == 3) {
					g2.drawOval(Math.min(x1, x2), Math.min(y1, y2),
							Math.abs(x1 - x2), Math.abs(y1 - y2));
				} else if (flag == 4) {
					g2.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2),
							Math.abs(x1 - x2), Math.abs(y1 - y2), 40, 40);
				}
			} else if (flag2 == 0) {
				if (flag3 == -3) {
					g2.setStroke(new BasicStroke((float) 10.0));
					g2.setColor(listener.color);
					g2.drawLine(x1, y1, x2, y2);
				} else if (flag3 == -2) {
					g2.setStroke(new BasicStroke((float) 10.0));
					g2.setColor(Color.white);
					g2.drawLine(x1, y1, x2, y2);
				}
			}
		}
	}
}
监听器类:

package com.test.lesson5;

import java.awt.AWTException;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;

public class DrawListener implements MouseListener, MouseMotionListener {
	public Graphics2D g;
	public ButtonGroup bg;
	public int x1, y1, x2, y2, x3, y3, x4, y4;
	public String command;
	public Random r = new Random();
	public boolean flag = true;
	Color color = Color.black;
	ArrayList<Integer> list;

	// 重载该类的构造方法
	public DrawListener(Graphics2D g, ButtonGroup bg, ArrayList<Integer> list) {
		this.g = g;
		this.bg = bg;
		this.list = list;
	}

	/********************** 按下 *************************/
	public void mousePressed(MouseEvent e) {
		x1 = e.getX();
		y1 = e.getY();
		// 获取JRadioButton上的命令
		ButtonModel model = bg.getSelection();
		command = model.getActionCommand();

		/*
		 * 里面的参数一定要是color,不然取色等于无 ,颜色默认的设置在鼠标按下的时候设置,刷子在拖动的过程中不会释放 相当于要写字的时候才拿笔
		 */
		g.setColor(color);
		// 设置粗细
		g.setStroke(new BasicStroke((float) 1.0));
	}

	/********************** 释放 *************************/
	public void mouseReleased(MouseEvent e) {

		/********************** 获取拖动到第二点坐标 *************************/
		x2 = e.getX();
		y2 = e.getY();

		/********************** 直线、矩形... *************************/
		if ("tuxing10".equals(command)) {
			g.drawLine(x1, y1, x2, y2);
			// 绘出图形后存放四个点、存放表示哪个点的int值、粗细、颜色
			list.add(1);
			list.add(-1);
			list.add(-3);
			list.add(x1);
			list.add(y1);
			list.add(x2);
			list.add(y2);
		} else if ("tuxing12".equals(command)) {
			g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
					Math.abs(y1 - y2));
			list.add(2);
			list.add(-1);
			list.add(-3);
			list.add(x1);
			list.add(y1);
			list.add(x2);
			list.add(y2);
		} else if ("tuxing14".equals(command)) {
			g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
					Math.abs(y1 - y2));
			list.add(3);
			list.add(-1);
			list.add(-3);
			list.add(x1);
			list.add(y1);
			list.add(x2);
			list.add(y2);
		} else if ("tuxing15".equals(command)) {
			g.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2),
					Math.abs(x1 - x2), Math.abs(y1 - y2), 40, 40);
			list.add(4);
			list.add(-1);
			list.add(-3);
			list.add(x1);
			list.add(y1);
			list.add(x2);
			list.add(y2);
		} else if ("tuxing13".equals(command)) {
			if (flag) {

				// 第一根线段
				g.drawLine(x1, y1, x2, y2);

				list.add(1);
				list.add(-1);
				list.add(-3);
				list.add(x1);
				list.add(y1);
				list.add(x2);
				list.add(y2);

				// 保存第一次按下的坐标
				x3 = x1;
				y3 = y1;

				// flag改变
				flag = false;
			} else {
				g.drawLine(x4, y4, x2, y2);

				list.add(1);
				list.add(-1);
				list.add(-3);
				list.add(x4);
				list.add(y4);
				list.add(x2);
				list.add(y2);

			}
			x4 = x2;
			y4 = y2;
		} else if ("tuxing1".equals(command)) {
			try {
				Robot robot = new Robot();
				BufferedImage image = robot.createScreenCapture(new Rectangle(
						Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
						Math.abs(y1 - y2)));
				image.createGraphics();
			} catch (AWTException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}

	/********************** 拖动 *************************/
	public void mouseDragged(MouseEvent e) {

		/********************** 获取拖动到第二点坐标 *************************/
		x2 = e.getX();
		y2 = e.getY();

		/********************** 橡皮擦、铅笔、刷子、喷枪 *************************/
		if ("tuxing2".equals(command)) {
			g.setStroke(new BasicStroke((float) 10.0));
			g.setColor(Color.white);
			g.drawLine(x1, y1, x2, y2);
			// 先存放点再
			list.add(1);
			list.add(0);
			list.add(-2);
			list.add(x1);
			list.add(y1);
			list.add(x2);
			list.add(y2);

			x1 = x2;
			y1 = y2;
		} else if ("tuxing6".equals(command)) {
			g.drawLine(x1, y1, x2, y2);

			list.add(1);
			list.add(-1);
			list.add(-3);
			list.add(x1);
			list.add(y1);
			list.add(x2);
			list.add(y2);

			x1 = x2;
			y1 = y2;
		} else if ("tuxing7".equals(command)) {
			g.setStroke(new BasicStroke((float) 10.0));
			g.drawLine(x1, y1, x2, y2);

			list.add(1);
			list.add(0);
			list.add(-3);
			list.add(x1);
			list.add(y1);
			list.add(x2);
			list.add(y2);

			x1 = x2;
			y1 = y2;
		} else if ("tuxing8".equals(command)) {
			for (int i = 0; i < 50; i++) {
				int a = r.nextInt(31) - 15;
				int b = r.nextInt(31) - 15;
				// 以点为半径
				g.drawLine(x2 + a, y2 + b, x2 + a, y2 + b);
				list.add(1);
				list.add(-1);
				list.add(-3);
				list.add(x2 + a);
				list.add(y2 + b);
				list.add(x2 + a);
				list.add(y2 + b);
			}
		}

	}

	public void mouseClicked(MouseEvent e) {
		if ("tuxing13".equals(command)) {
			if (e.getClickCount() == 2) {
				g.drawLine(x2, y2, x3, y3);

				list.add(1);
				list.add(-1);
				list.add(-3);
				list.add(x2);
				list.add(y2);
				list.add(x3);
				list.add(y3);

				// flag恢复默认true
				flag = true;
			}
		} else if ("tuxing4".equals(command)) {

			// 取坐标,相对于屏幕的坐标,不然有错
			x2 = e.getXOnScreen();
			y2 = e.getYOnScreen();

			// 截图
			try {
				Robot robot = new Robot();

				// 默认一个像素的宽高都是1
				BufferedImage image = robot.createScreenCapture(new Rectangle(
						x2, y2, 1, 1));

				// 截取的一块矩形只有一个像素点,所以坐标是(0,0)
				color = new Color(image.getRGB(0, 0));
			} catch (AWTException e1) {
				e1.printStackTrace();
			}
		}

	}

	public void mouseMoved(MouseEvent arg0) {

	}

	public void mouseEntered(MouseEvent arg0) {

	}

	public void mouseExited(MouseEvent arg0) {

	}
}
颜色监听器类:

package com.test.lesson5;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class ColorListener implements ActionListener {
	public Color color;
	public DrawBoard db;

	// 要将当前color传到DrawListener中,要获得DrawListener的对象,而该对象在DrawListener中,所以
	public ColorListener(DrawBoard db) {
		this.db = db;
	}

	public void actionPerformed(ActionEvent e) {

		// 原本e.getSourse得到的是Object类型的,强制转换为JButton
		JButton jb = (JButton) e.getSource();
		color = jb.getBackground();

		db.listener.color = color;
		db.jbt1.setBackground(color);
	}
}
测试类:
package com.test.lesson5;

public class Test {
	public static void main(String[] args) {
		DrawBoard db = new DrawBoard();
		db.init();
	}
}



  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值