简介:本文讲解如何用java写一个简单的画图软件。 运行效果:
代码:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
public class Main {
// 创建窗口对象
private Frame frame = new Frame("简答手绘程序");
// 定义画图区的宽高
private final int AREA_WIDTH = 500;
private final int AREA_HEIGHT = 400;
// 定义一个右键菜单 用于设置画笔的颜色
private PopupMenu colorMenu = new PopupMenu(); // 那个颜色选择框的菜单
private MenuItem redItem = new MenuItem("红色");
private MenuItem greenItem = new MenuItem("绿色");
private MenuItem blueItem = new MenuItem("蓝色");
// 定义一个变量 距离当前画笔的颜色
private Color forceColor = Color.BLACK;
// 创建一个BufferedImage位图对象
BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_BGR); // 参数顺序 宽 高 图片类型
// 通过位图,获取关联的Graphics对象
Graphics g = image.getGraphics();
// 自定义一个类 继承 Canves
private class MyCanves extends Canvas{
@Override
public void paint(Graphics g) {
g.drawImage(image, 0, 0, null); // 图的来源 图的位置x 图的位置y 观察者(没有填null)
}
}
MyCanves drawArea = new MyCanves(); // 创建一个画布
// 定义变量 记录 鼠标拖动过程中 上一次所处的坐标
private int preX = -1;
private int preY = -1;
public void init(){
// 组装视图 逻辑控制
// 注册监听器
ActionListener listener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
switch (actionCommand){
case "红色":
forceColor = Color.RED;
break;
case "绿色":
forceColor = Color.GREEN;
break;
case "蓝色":
forceColor = Color.BLUE;
break;
}
}
};
// 给菜单每个按钮添加监听器
redItem.addActionListener(listener);
greenItem.addActionListener(listener);
blueItem.addActionListener(listener);
// 把每个菜单按钮添加到菜单中
colorMenu.add(redItem);
colorMenu.add(greenItem);
colorMenu.add(blueItem);
// 把colorMenu设置给绘图区域
drawArea.add(colorMenu);
// 添加鼠标点击监听器
drawArea.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
boolean popupTrigger = e.isPopupTrigger();
if (popupTrigger){ // 右键释放后 在drawArea上的 x, y位置显示图像
colorMenu.show(drawArea, e.getX(), e.getY());
}
// 鼠标松开的时候 重置 preX和preY
preX = -1;
preY = -1;
}
});
// 设置位图的背景为白色
g.setColor(Color.white);
// 设置位图为矩形
g.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);
// 通过监听鼠标的移动 完成线条绘制 // 这里用的是鼠标移动的监听器
drawArea.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
if (preX > 0 && preY > 0){
// 设置线条的颜色
g.setColor(forceColor);
// 画线条
// 前两个参数是 一条线的上一个点的坐标 后面两个参数是 线的终点坐标
g.drawLine(preX, preY, e.getX(), e.getY());
}
// 修正preX 和 preY的值
preX = e.getX();
preY = e.getY();
// 重绘组件
drawArea.repaint();
}
});
drawArea.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT));
frame.add(drawArea);
// 关闭按钮
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args){
new Main().init();
}
}