Java Awt 实现绘画版效果

这个博客介绍了一个使用Java实现的简单位图绘图程序。程序创建了一个BufferedImage对象作为内存中的图片,通过获取其Graphics对象进行绘图,并提供了右键菜单选择不同颜色的画笔。用户可以通过鼠标拖动在画布上绘制线条,实现了基本的绘图功能,提升了用户体验。
摘要由CSDN通过智能技术生成
package zikao;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

public class BufferedImageDemo {
    /*
    位图使用步骤:
    1,创建Image的子类对象BufferedImage(int width,int height,int ImageType),创建时需要指定位图的
    宽高及类型属性,此时相当于在内存中生成了一张图片
    2,调用BufferedImage对象的getGraphics()方法获取画笔,此时就可以往内存中的这张图片绘图.
    3,调用paint方法中提供的Graphics对象的drawImage()方法,一次性的内存中的图片绘制到特定的组件上
    好处:
    实现位图的缓冲区,用户体验优化
     */
    private final Frame frame = new Frame("简单手绘程序");
    private final int AREA_WIDTH = 500;
    private final int AREA_HEIGHT = 400;
    //定义一个右键菜单,设置画笔颜色
    private final PopupMenu colorMenu = new PopupMenu();
    private final MenuItem redItem = new MenuItem("红色");
    private final MenuItem greenItem = new MenuItem("绿色");
    private final MenuItem blueItem = new MenuItem("蓝色");

    //定义一个记录画笔颜色的变量
    private Color forceColor = Color.BLACK;
    //创建一个BufferedImage位图对象
    private int preX = -1;
    private int preY = -1;
    BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_RGB);
    //通过位图,获取关联的Graphics对象
    Graphics g = image.getGraphics();

    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 = e -> {
            String actionCommand = e.getActionCommand();
            switch (actionCommand) {
                case "红色" -> forceColor = Color.RED;
                case "绿色" -> forceColor = Color.GREEN;
                case "蓝色" -> forceColor = Color.BLUE;
            }
        };
        redItem.addActionListener(listener);
        greenItem.addActionListener(listener);
        blueItem.addActionListener(listener);
        colorMenu.add(redItem);
        colorMenu.add(greenItem);
        colorMenu.add(blueItem);
        drawArea.add(colorMenu);
        drawArea.addMouseListener(new MouseAdapter() {
            @Override
            //鼠标键抬起
            public void mouseReleased(MouseEvent e) {
                boolean popupTrigger = e.isPopupTrigger();
                if (popupTrigger) {
                    colorMenu.show(drawArea, e.getX(), e.getY());
                }
                //重置preX和preY
                preY = -1;
                preX = -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的值
                                          preY = e.getY();
                                          preX = e.getX();
                                          //重绘组件
                                          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 BufferedImageDemo().init();
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值