一、步骤:

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恢复默认trueflag = true;
}

这样多边形也绘制完了

10、取色器:用Robot类

分析:点击,截图,取色

// 取坐标,相对于屏幕的坐标,不然有错
x2 = e.getXOnScreen();
y2 = e.getYOnScreen();// 截图
try {Robot robot = new Robot();// 默认一个像素的宽高都是1BufferedImage 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 blocke1.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恢复默认trueflag = true;}} else if ("tuxing4".equals(command)) {// 取坐标,相对于屏幕的坐标,不然有错x2 = e.getXOnScreen();y2 = e.getYOnScreen();// 截图try {Robot robot = new Robot();// 默认一个像素的宽高都是1BufferedImage 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类型的,强制转换为JButtonJButton 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();}
}

Java基础学习之画板1相关推荐

  1. java基础学习整理(一)

    java基础学习整理(一) lesson1: D0s命令: 1.回到根目录,>cd \ 2.复制命令行下的内容,右击标记所要复制的内容,这样就已经复制好了,右击粘贴就可以了. 3.查看,设置环境 ...

  2. 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结

    Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...

  3. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  4. java基础学安卓开发_Android开发学习路线之Java基础学习

    原标题:Android开发学习路线之Java基础学习 很多Android学习开发者刚入手Android开发技术时,稍微有点迫切.任何的开发技术都有其基础语言,Android应用程序开发是以Java语言 ...

  5. Java基础学习:尚硅谷项目三 开发团队调度软件

    Java基础学习:尚硅谷项目三 开发团队调度软件 一.软件功能与结构设计 1. 软件功能 该软件实现以下功能: 软件启动时,根据给定的数据创建公司部分成员列表(数组) 根据菜单提示,基于现有的公司成员 ...

  6. Java基础学习汇总

    Java基础学习汇总 java语言基础 java函数和数组 java面向对象 java异常 整理用,早就停更... 写作不易,如果您觉得写的不错,欢迎给博主点赞.收藏.评论.收藏来一波~让博主更有动力 ...

  7. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  8. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  9. Java基础学习(9)

    Java基础学习 一.常用方法(API) 1.1 Math 1.2 System 1.3 Runtime 1. 4 .object 1.5 Objects 1.6 BigInteger BigInte ...

  10. java基础小记_[Java教程]Java基础学习小记

    [Java教程]Java基础学习小记 0 2016-10-07 18:00:07 题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓"早起毁一天"不是没有道理哪 ...

最新文章

  1. Ubantu16.04安装显卡驱动遇到的坑
  2. UE4学习-创建基于C++的场景
  3. mysql结构优化_MySQL优化----数据库结构优化
  4. Openpose——windows编译(炒鸡简单)
  5. 关于_vmvare workstation装32ubuntu的问题
  6. EditPlus使用技巧(汇总)
  7. 使用Powershell远程管理Windows Server(WinRM)
  8. Java 8 时间日期库的20个使用演示样例
  9. 数据库期末总结笔记( 零基础 )--数据库安全性与完整性-范式-E-R图
  10. cloud 调用列表并返回数据操作代码
  11. 删库跑路mini版!程序员写代码给自己转账21万!判了~
  12. Anroid性能优化系列——Improving Layout Performance(一)
  13. 用随机过程进行系统识别
  14. js实现表格任意框选_[R] 在表格中插入图形 - formattable + htmlwidgets
  15. npm下载axios
  16. Python学习笔记17:玩转千图成像
  17. quartz 整合 postgresql 附带例子
  18. wps2016向程序发送命令_老司机帮您向程序发送命令时出现错误 【操作步骤】 的设置办法...
  19. NOIP 2014 primeの酱油记+题解
  20. 厦门新车上牌经验分享

热门文章

  1. Pycharm 简单设置成官方中文版
  2. msdev devenv 的命令行用法
  3. silk lobe资源公众号_微小说全免费阅读公众号阅读网资源推荐
  4. C语言32个关键字详解
  5. 深度学习画图软件收集
  6. 知识图谱商业应用 、介绍
  7. 中呜机器人编程视频教程_中鸣快车编程入门篇—5.1补充的知识.doc
  8. 软件设计师(中级)历年真题与知识点总结(更新中...)
  9. 中国移动计算机类行测题目,2021三大运营商春招笔试:中国移动行测练习题(2)...
  10. 基于java(springboot框架)的新闻管理系统 开题报告