简介:本文讲解如何用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(); } }