首页 > 编程语言 >Java实验-Swing 涂鸦板

Java实验-Swing 涂鸦板

时间:2023-03-02 13:23:08浏览次数:36  
标签:awt Java java Color Swing new import 涂鸦板 public

实验要求:

涂鸦板是一个具有趣味性的小程序,它的实现原理是通过鼠标事件,控制鼠标移动结合画图功能实现。鼠标拖拽才开始绘制,松开鼠标则停止绘制。

代码:

--MyPaint画板类:

package com.junlin.exer6;

import javax.swing.JLabel;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

public class MyPaint extends JLabel {
    private boolean is_painting = false;  //判断是否正在绘制
    private List<Curve> curves = new ArrayList<>();  //记录绘制过程中所有的曲线

    //记录使用过的线条粗细,主要是为了保留之前绘制的效果,不会让改变线条粗细影响之前的绘制
    private List<Float> lineSizes = new ArrayList<>();

    //同上记录使用过的颜色
    private List<Color> lineColors = new ArrayList<>();
    private Float currentLineSize = 2.0f;  //当前线条的粗细
    private Color currentLineColor = Color.RED;

    public MyPaint(){
        //绑定事件
        MyMouseListener handler = new MyMouseListener();
        this.addMouseListener(handler);
        this.addMouseMotionListener(handler);
    }

    public void setCurrentLineSize(float currentLineSize) {
        this.currentLineSize = currentLineSize;
    }
    public void setCurrentLineColor(Color color) {
        this.currentLineColor = color;
    }

    //下面这个方法在程序运行的时候被一直调用
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int width = getWidth();
        int height = getHeight();
        //this.setOpaque(true);
        //this.setBackground(Color.WHITE);  //为什么这行代码不起作用就是因为没有写上面设置透明度的代码

//        System.out.printf("%d %d\n", width, height);
        g.setColor(Color.WHITE);
        g.fillRect(0,0,width,height);
        //g.setFont(new Font("宋体", Font.BOLD, 200));
        Graphics2D g2 = (Graphics2D)g;  //g是Graphics对象
        g2.setStroke(new BasicStroke(currentLineSize));
        g2.setPaint(currentLineColor);

        //从曲线集合中进行绘制
        for(int i = 0;i < curves.size();i++) {
            Curve curve = curves.get(i);
            g2.setStroke(new BasicStroke(lineSizes.get(i)));
            g2.setPaint(lineColors.get(i));
            if(curve.points.size() >= 2) {
                Point p1 = curve.points.get(0);
                for(int j = 1;j < curve.points.size();j++){
                    Point p2 = curve.points.get(j);
                    g.drawLine(p1.x,p1.y,p2.x,p2.y);
                    p1 = p2;
                }
            }
        }
    }

    //清空画板
    public void clearPaint() {
        this.curves.clear();
        this.lineSizes.clear();
        this.lineColors.clear();
        repaint();
    }


    //监听内部类
    public class MyMouseListener extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            is_painting = true;
            lineSizes.add(currentLineSize);
            lineColors.add(currentLineColor);
            Curve curve = new Curve();
            curve.points = new ArrayList<>();
            curves.add(curve);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            is_painting = false;
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            //如果表示正在绘制
            if(is_painting) {
                //取出曲线集合中的最后一条曲线(就是当前正在绘制的曲线)
                Curve curve = curves.get(curves.size() - 1);
                curve.points.add(e.getPoint());  //将当前的点加入曲线中
                repaint();   //重新绘制
            }
        }
    }

    //曲线内部类,其属性就是曲线上的点的集合
    public class Curve {
        List<Point> points;
    }
}

MyFrame窗体类:

package com.junlin.exer6;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;


public class MyFrame extends JFrame {
    public MyFrame(){
        super("涂鸦板");

        JPanel root = new JPanel();
        root.setLayout(null);
        this.add(root);

        //自定义画板控件
        MyPaint paint = new MyPaint();
        paint.setBounds(250,10,600,600);
        root.add(paint);

        //清除画板按钮
        JButton clearBtn = new JButton("清空画板");
        clearBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                paint.clearPaint();
            }
        });
        clearBtn.setBounds(70,40,95,40);
        root.add(clearBtn);

        //文本标签
        JLabel lineSizeLabel = new JLabel("选择线条粗细:");
        lineSizeLabel.setBounds(10,300,100,20);
        lineSizeLabel.setFont(new Font("宋体", Font.BOLD, 14));
        root.add(lineSizeLabel);

        //线条粗细列表
        JComboBox<String> LineTypeField = new JComboBox<>();
        for(int i = 2;i <= 12;i += 2) {
            LineTypeField.addItem(i+"");
        }
        LineTypeField.setBounds(120,300,100,30);
        LineTypeField.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    // 选择的下拉框选项
                    System.out.println(e.getItem() instanceof String);
                    float size = Float.parseFloat(String.valueOf(e.getItem()));
                    paint.setCurrentLineSize(size);
                }
            }
        });
        root.add(LineTypeField);


        //文本控件
        JLabel lineColorLabel = new JLabel("选择线条颜色:");
        lineColorLabel.setBounds(10,200,100,20);
        lineColorLabel.setFont(new Font("宋体", Font.BOLD, 14));
        root.add(lineColorLabel);

        //颜色选择列表
        JComboBox<String> LineColorField = new JComboBox<>();
        LineColorField.addItem("红色");
        LineColorField.addItem("蓝色");
        LineColorField.addItem("粉红色");
        LineColorField.addItem("橙色");
        LineColorField.addItem("绿色");
        LineColorField.setBounds(120,200,100,30);
        LineColorField.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    // 选择的下拉框选项
                    Color color;
                    switch (String.valueOf(e.getItem())) {
                        case "红色":
                            color = Color.RED;
                            break;
                        case "蓝色":
                            color = Color.BLUE;
                            break;
                        case "粉红色":
                            color = Color.PINK;
                            break;
                        case "橙色":
                            color = Color.ORANGE;
                            break;
                        case "绿色":
                            color = Color.GREEN;
                            break;
                        default:
                            color = Color.BLACK;
                            break;
                    }
                    paint.setCurrentLineColor(color);
                }
            }
        });
        root.add(LineColorField);

        this.setSize(1000,700);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}


--JavaMain主类:

package com.junlin.exer6;

public class JavaMain {
    public static void main(String[] args) {
        new MyFrame();
    }
}

标签:awt,Java,java,Color,Swing,new,import,涂鸦板,public
From: https://www.cnblogs.com/junlin623/p/17171466.html

相关文章

  • java调用WCF服务
    一、概述最近项目上有需要和建科机器进行通信的需求,而建科这边给的技术文档和服务都是webservice的,我这边要做的就是用Java和建科的webservice交互。启动建科的webservice......
  • 【JavaScript】33_递归
    17、递归递归调用自身的函数称为递归函数递归的作用和循环是基本一直递归的核心思想就是将一个大的问题拆分为一个一个小的问题,小的问题解决了,大的问题也就解决了编写递归函......
  • mac系统上hdfs java api的简单使用
    1、背景在上一节中,我们简单学习了在命令行上如何操作hdfsshellapi,此处我们通过java程序来操作一下。2、环境准备需要在本地环境变量中配置HADOOP_HOME或在程序启动......
  • mac系统上hdfs java api的简单使用
    目录1、背景2、环境准备3、环境搭建3.1引入jar包3.2引入log4j.properties配置文件3.3初始化HadoopApi4、javaapi操作4.1创建目录4.2上传文件4.3列出目录下有哪些文......
  • Java读取文件的几种方式
    1.使用流读取文件publicstaticvoidstream(){StringfileName="D:\\test.txt";finalStringCHARSET_NAME="UTF-8";List<String>content=new......
  • 【javascript】slice()、substring()和substr() 三种字符串截取方法区别
    slice(start,end):slice(start,end)方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。 1、start(包含)和end(不包含)参数来指定字符串提取的部分;2、......
  • Java--判空方法
    方法有StringUtils.isBlank(),StringUtils.isNotBlank(),StringUtils.isEmpty();使用关系StringUtils.isNotEmpty()==!StringUtils.isEmpty();StringUti......
  • 【JavaScript】- map、forEach、filter之间的区别!
    map、forEach、filter这三者都可以遍历数组,他们之间有什么区别呢?map():方法定义在JavaScript的Array中,它返回一个新的数组,数组中的元素为原始数组调用函数处理后的值值得......
  • Java/.Net双平台核心,Jvm和CLR运行异同点
    前言:本篇以.Net7.0.2CLR和OpenJDk19参照,解析下它们各自调用函数的异同。以下为个人理解。概述JDK大约5.9G,CLR大约7.6G,两者相差1.7G左右。root@tang-virtual-mac......
  • JAVA设计模式之单例模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及......