Java_画图软件

简介: 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();
    }
}
相关文章
|
6天前
|
Java Linux 开发者
软件体系结构 - Java垃圾收集器
【4月更文挑战第22天】软件体系结构 - Java垃圾收集器
19 4
|
2月前
|
Java 开发者 微服务
Java企业应用软件系统架构演变史
Java企业应用软件系统架构演变史
31 0
|
8月前
|
分布式计算 Java 开发者
GitHub爆款!Java性能优化:轻松道破软件性能调优,不止搞定JVM
今天给大家带来的是:周明耀老师的 《大话Java性能优化:轻松道破软件性能调优方法论和具体实现路径》,全面细致,一本书搞定性能优化 周明耀是谁? 12年投资银行项目、分布式计算项目工作经验,IBM开发者论坛专家作者。一名IT技术狂热爱好者,一名顽强到底的工程师。推崇技术创新、思维创新,对于新技术非常的热爱,致力于技术研发、研究,通过发布文章、书籍、互动活动的形式积极推广软件技术。欢迎添加作者“michael_tec”,共同探讨IT技术话题。
|
7月前
|
算法 Java 测试技术
【备战蓝桥杯 | 软件Java大学B组】十三届真题深刨详解(2)
【备战蓝桥杯 | 软件Java大学B组】十三届真题深刨详解(2)
39 0
|
7月前
|
前端开发 JavaScript Java
Java中规模软件开发实训——掌握财务自由的关键!解锁智能家庭记账系统的神奇力量!(家庭记账软件)
​ ✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(html css js) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页
80 0
|
12天前
|
JavaScript Java 测试技术
基于Java的库存管理软件的设计与实现(源码+lw+部署文档+讲解等)
基于Java的库存管理软件的设计与实现(源码+lw+部署文档+讲解等)
24 1
|
17天前
|
Java 测试技术
[软件自动化测试] selenium java环境配置
介绍了包括选择Gradle构建,关闭Gradle Wrapper的默认下载,修改`gradle-wrapper.properties`以使用腾讯云镜像,以及更新`build.gradle`文件添加国内仓库和Selenium依赖。在测试驱动部分,创建了一个简单的JUnit测试用例,展示了如何初始化Edge浏览器并访问网站。运行测试时可能出现关于CDP版本不匹配的警告,可以通过升级Selenium依赖中的CDP版本来解决。推荐根据[Selenium库网页](https://search.maven.org/search?q=g:org.seleniumhq.selenium)提供的版本信息进行升级
334 6
|
7月前
|
存储 人工智能 Java
【备战蓝桥杯 | 软件Java大学B组】十三届真题深刨详解(1)
【备战蓝桥杯 | 软件Java大学B组】十三届真题深刨详解(1)
375 0
|
9月前
|
Java 关系型数据库 MySQL
CentOS需要安装的JAVA环境的相关软件
【JDK 1.7】 https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u80-oth-JPR 选择 Java SE Development Kit 7u80 下面的 Accept License Agreement 然后点击 jdk-7u80-linux-x64.tar.gz 下载 【Tomcat 7】 http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0
|
6月前
|
存储 前端开发 Java
Java Web框架,如Spring MVC,是一种用于构建Web应用程序的软件框架:学生考试Web应用程序
Java Web框架,如Spring MVC,是一种用于构建Web应用程序的软件框架。它们提供了一种结构化的方法,用于处理Web请求、生成动态内容和管理Web应用程序的组件。以下是关于Java Web框架和Spring MVC的详细解释,以及如何使用Spring MVC创建一个简单的Web应用程序的示例代码。