实现效果:
1.用鼠标在画板上拖拽实现画线条:
2.右击鼠标点击指定的颜色可切换画笔颜色,再次拖拽实现画线条:
代码实现:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
//简单手绘画板
public class HandDraw {
JFrame frame = new JFrame("简单手绘画板");
//定义画图区的宽度和高度
private final int AREA_WIDTH = 800;
private final int AREA_HEIGHT = 700;
//定义右键菜单,用来设置画笔的颜色
private PopupMenu colorMenu = new PopupMenu();
private MenuItem redItem = new MenuItem("红色");
private MenuItem greenItem = new MenuItem("绿色");
private MenuItem blueItem = new MenuItem("蓝色");
//记录当前画笔的颜色
private Color newColor = Color.black;//默认为黑色
//创建BufferedImage位图对象
private BufferedImage image = new BufferedImage(AREA_WIDTH,AREA_HEIGHT,BufferedImage.TYPE_INT_RGB);
//通过位图获取关联的Graphice对象
Graphics graphics = image.getGraphics();
//定义变量记录鼠标拖拽移动过程中,上一次的坐标
private int preX = -1;
private int preY = -1;
private class MyCanvas extends Canvas {//定义画板
@Override
public void paint(Graphics g) {
g.drawImage(image,0,0,null);
}
}
MyCanvas drawArea = new MyCanvas();//创建画板
public void init(){
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {//单击执行的操作
String actionCommand = e.getActionCommand();//获取鼠标右击的内容
switch(actionCommand){
case "红色":
newColor = Color.red;
break;
case "绿色":
newColor = Color.green;
break;
case "蓝色":
newColor = Color.blue;
break;
}
}
};
redItem.addActionListener(listener);
greenItem.addActionListener(listener);
blueItem.addActionListener(listener);
colorMenu.add(redItem);
colorMenu.add(greenItem);
colorMenu.add(blueItem);
//将colorMenu设置给drawArea绘图区
drawArea.add(colorMenu);
//frame.add(colorMenu);
drawArea.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {//当鼠标点击释放时
boolean p = e.isPopupTrigger();
if(p){
//在绘画区域指定的xy轴上单击绘图colorMenu右击菜单键
colorMenu.show(drawArea,e.getX(),e.getY());
}
//鼠标抬起时重置preX和preY
preX = -1;
preY = -1;
}
});
//通过监听鼠标的移动,来绘制线条
drawArea.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {//鼠标拖拽
if(preX > 0 && preY > 0){
//获取指定的颜色
graphics.setColor(newColor);
//绘制线条,需要两坐标接收上一次的起点位置和终点位置
graphics.drawLine(preX,preY,e.getX(),e.getY());
}
//刷新preX和preY的坐标
preX = e.getX();
preY = e.getY();
//绘图
drawArea.repaint();
}
});
//设置位图属性
graphics.setColor(Color.white);
graphics.fillRect(0,0,AREA_WIDTH,AREA_HEIGHT);
drawArea.setPreferredSize(new Dimension(AREA_WIDTH,AREA_HEIGHT));//设置绘图宽高
frame.add(drawArea);
frame.setLocation(600,150);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new HandDraw().init();
}
}