Java_画图软件

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值