Java绘制椭圆和矩形(实现自由变化大小的功能)

Java绘制椭圆和矩形(实现自由变化大小的功能),第1张

Java绘制椭圆矩形(实现自由变化大小的功能)

        一个简单的画板应用程序,用户可以通过鼠标在画板上自由绘制任意大小的矩形或椭圆

         用户通过点击按钮,选择要绘制的矩形(rect)或者椭圆(oval),以及选择画笔的颜色(红色、蓝色、以及黑色)。绘制完成后,用户可以通过点击菜单条上的file菜单下的sava选项进行保存。

程序具体效果图:

 

注意:

           1.画笔的默认颜色为黑色。

           2.需要先点击rect(矩形)或者oval(椭圆)按钮再进行绘制。

           3.保存绘制的图形时,文件的后缀名应为jpg格式(即在文件名后面加上.jpg)。

           4.矩形椭圆均为填充图形。

具体实现过程且看以下代码(代码内部有详细的注解)。 代码: 
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class PaintTest {
    //创建一个窗口
    private Jframe f=new Jframe("画板");
    //定义一个菜单条以及菜单和菜单项
    private JMenuBar jMenuBar;
    private JMenu file;
    private JMenuItem save=new JMenuItem("save");;
    //设置窗口大小
    private final int TABLE_HEIGHT=500;
    private final int TABLE_WIDTH=500;
    //初始化鼠标起始位置
    private int preX=-1;
    private int preY=-1;
    //获取鼠标松开位置
    private int lastX;
    private int lastY;
    //初始图形长宽;
    private int height;
    private int width;
    //初始化颜色;
    private Color color=Color.BLACK;
    //颜色按钮
    JButton red =new JButton("red");
    JButton blue =new JButton("blue");
    JButton black =new JButton("black");
    //矩形椭圆按钮
    JButton rect=new JButton("rect");
    JButton oval=new JButton("oval");
    //定义一个变量获取需要画的图形;
    String str="";
    //获取一个BufferedImage对象,调用该对象中的方法获取画笔
    BufferedImage image=new BufferedImage(TABLE_WIDTH,TABLE_HEIGHT,BufferedImage.TYPE_INT_BGR);
    Graphics g=image.getGraphics();
    //定义一个方法用于初始化变量
    public void initialize(){
        this.preX=-1;
        this.preY=-1;
        this.lastX=-1;
        this.lastY=-1;
    }
    //创建一个画布
    private class MyCanvas extends JPanel{
        @Override
        public void paint(Graphics g) {
            //画位图,将本机图片复制到画布上去
            g.drawImage(image,0,0,null);
            if(str.equals("绘制矩形")){
                g.setColor(color);
                g.fillRect(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));
            }else if(str.equals("绘制椭圆")){
                g.setColor(color);
                g.fillOval(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));
            }
        }
    }
    MyCanvas myDraw=new MyCanvas();
    //自定义点击按钮发生颜色变化的方法
    private void setColor(Color redColor,Color blueColor,Color blackColor){
        red.setBackground(redColor);
        blue.setBackground(blueColor);
        black.setBackground(blackColor);
    }
    private void setColor(Color rectColor,Color ovalColor){
        rect.setBackground(rectColor);
        oval.setBackground(ovalColor);
    }
    //组装视图
    public void init(){
        JPanel colorGroup=new JPanel();
        colorGroup.add(red);
        colorGroup.add(blue);
        colorGroup.add(black);
        JPanel graphGroup=new JPanel();
        graphGroup.add(rect);
        graphGroup.add(oval);
        //定义一个点击事件处理器
       ActionListener actionListener=new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent e) {
               //获取点击的内容
               String actionCommand = e.getActionCommand();
               //switch语句用于处理点击不同内容的事件处理
               switch (actionCommand){
                   case "red":
                       //设置按钮颜色
                       setColor(Color.RED,Color.WHITE,Color.WHITE);
                       //设置画笔颜色
                       color=Color.RED;
                       break;
                   case "blue":
                       setColor(Color.WHITE,Color.BLUE,Color.WHITE);
                       color=Color.BLUE;
                       break;
                   case "black":
                       setColor(Color.WHITE,Color.WHITE,Color.BLACK);
                       color=Color.BLACK;
                       break;
                   case "rect":
                       str="绘制矩形";
                       //初始化变量
                       initialize();
                       setColor(Color.YELLOW,Color.WHITE);
                       break;
                   case "oval":
                       str="绘制椭圆";
                       //初始化变量
                       initialize();
                       setColor(Color.WHITE,Color.YELLOW);
                       break;
                   case "save":
                       //保存画的图形
                       FileDialog fileSave=new FileDialog(f,"open",FileDialog.SAVE);
                       fileSave.setVisible(true);
                       //获取文件名和文件位置
                       String file = fileSave.getFile();
                       String directory = fileSave.getDirectory();
                       try {
                           //解决空指针异常
                           if(file==null||directory==null){
                               return;
                           }
                           ImageIO.write(image,"JPEG" ,new File(directory,file));
                       } catch (IOException ioException) {
                           ioException.printStackTrace();
                       }
                       break;
               }
           }
       };
       //添加事件处理器
        red.addActionListener(actionListener);
        blue.addActionListener(actionListener);
        black.addActionListener(actionListener);
        rect.addActionListener(actionListener);
        oval.addActionListener(actionListener);
        save.addActionListener(actionListener);
        //设置画板为白色
        g.setColor(Color.white);
        g.fillRect(0,0,TABLE_WIDTH,TABLE_HEIGHT);
        //画布添加鼠标事件处理
        myDraw.addMouseListener(new MouseAdapter() {
            @Override
            //鼠标按下事件处理,用于获取鼠标按下时的位置
            public void mousePressed(MouseEvent e) {
                    preX=e.getX();
                    preY=e.getY();
            }
            //松开事件处理,用于获取鼠标松开后的位置
            public void mouseReleased(MouseEvent e) {
                lastX=e.getX();
                lastY=e.getY();
                //在image画布上画出相应图形
                if(str.equals("绘制矩形")){
                    g.setColor(color);
                    g.fillRect(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));
                    initialize();
                }else if (str.equals("绘制椭圆")){
                    g.setColor(color);
                    g.fillOval(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY));
                    initialize();
                }
            }
        });
        //鼠标移动事件处理
        myDraw.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            //鼠标拖动事件处理,获取鼠标拖动实时位置
            public void mouseDragged(MouseEvent e) {
                lastX=e.getX();
                lastY=e.getY();
                myDraw.repaint();
            }
        });
        //设置画布大小
        myDraw.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
        //添加画布
        f.add(myDraw);
        //组装并添加菜单条
        jMenuBar=new JMenuBar();
        file=new JMenu("file");
        file.add(save);
        jMenuBar.add(file);
        f.setJMenuBar(jMenuBar);
        //将颜色按钮,图形按钮分别位于窗口的北方和南方
        f.add(colorGroup,BorderLayout.NORTH);
        f.add(graphGroup,BorderLayout.SOUTH);
        //设置窗口为一个合适大小
        f.pack();
        //设置窗口关闭功能
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);
        f.setVisible(true);
    }
    public static void main(String[] args) {
       new PaintTest().init();
    }
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5706799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存