Java矢量画图工具

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * VectorFrameTest.java
 *
 * Created on 2010-11-4, 15:25:14
 */

package vectordraw;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

 


/**
 *
 * @author tangxiaolong
 */
public class VectorFrame {
    public static void main(String[] args) {
        new VectorFrameTest();
    }
}
class VectorFrameTest extends javax.swing.JFrame {

    //选择模式,0代表直线绘制,1代表椭圆绘制,2代表矩形绘制
    public static int mode = 0;
    private JFileChooser chooser = new JFileChooser();
    FileNameExtensionFilter filter = null;

    /** Creates new form VectorFrameTest */
    public VectorFrameTest() {
        this.setVisible(true);
        initComponents();
        Toolkit tk = getToolkit();
        Dimension screenSize = tk.getScreenSize();
        int screenWidth = screenSize.width;
        int screenHeight = screenSize.height;
        this.setBounds(screenWidth / 4, screenHeight / 4, screenWidth / 2, screenHeight / 2);
        JPanel jp = new DrawPanel();
        jp.addMouseListener(new MouseAdapter() {
        });
        add(jp);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        toolBar = new javax.swing.JToolBar();
        line = new javax.swing.JButton();
        circle = new javax.swing.JButton();
        rectangle = new javax.swing.JButton();
        edit = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        mainMenuBar = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem openMenuItem = new javax.swing.JMenuItem();
        saveMenuItem = new javax.swing.JMenuItem();
        exitMenuItem = new javax.swing.JMenuItem();
        editMenu = new javax.swing.JMenu();
        jSeparator1 = new javax.swing.JSeparator();
        helpMenu = new javax.swing.JMenu();
        helpMenuItem = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("VectorDraw");

        toolBar.setRollover(true);

        line.setText("线段");
        line.setFocusable(false);
        line.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        line.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        line.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                lineActionPerformed(evt);
            }
        });
        toolBar.add(line);

        circle.setText("圆");
        circle.setFocusable(false);
        circle.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        circle.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        circle.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                circleActionPerformed(evt);
            }
        });
        toolBar.add(circle);

        rectangle.setText("矩形");
        rectangle.setFocusable(false);
        rectangle.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        rectangle.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        rectangle.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rectangleActionPerformed(evt);
            }
        });
        toolBar.add(rectangle);

        edit.setText("修改");
        edit.setFocusable(false);
        edit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        edit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        edit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editActionPerformed(evt);
            }
        });
        toolBar.add(edit);

        jLabel1.setText("  X:");
        toolBar.add(jLabel1);

        jLabel3.setText("0.0");
        jLabel3.setSize(10, 20);
        toolBar.add(jLabel3);

        jLabel2.setText("  Y:");
        toolBar.add(jLabel2);

        jLabel4.setText("0.0");
        jLabel4.setSize(10, 20);
        toolBar.add(jLabel4);

        jLabel5.setText("    ");
        toolBar.add(jLabel5);

        jLabel6.setText("UP");
        toolBar.add(jLabel6);

        getContentPane().add(toolBar, java.awt.BorderLayout.PAGE_START);

        fileMenu.setText("文件");
        fileMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fileMenuActionPerformed(evt);
            }
        });

        openMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
        openMenuItem.setText("打开");
        openMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(openMenuItem);

        saveMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        saveMenuItem.setText("保存");
        saveMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(saveMenuItem);

        exitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK));
        exitMenuItem.setText("退出");
        exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(exitMenuItem);

        mainMenuBar.add(fileMenu);

        editMenu.setText("编辑");
        editMenu.add(jSeparator1);

        mainMenuBar.add(editMenu);

        helpMenu.setText("帮助");

        helpMenuItem.setText("关于");
        helpMenu.add(helpMenuItem);

        mainMenuBar.add(helpMenu);

        setJMenuBar(mainMenuBar);

        pack();
    }// </editor-fold>

    private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                            
        int tmp = JOptionPane.showConfirmDialog(this, "请选择是否退出程序?", "退出程序", JOptionPane.YES_NO_OPTION);
        if (tmp == 0) {
            System.exit(0);
        }
}                                           

    private void lineActionPerformed(java.awt.event.ActionEvent evt) {                                    
        mode = 0;
}                                   

    private void circleActionPerformed(java.awt.event.ActionEvent evt) {                                      
        mode = 1;
}                                     

    private void saveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        chooser.setDialogTitle("保存我的文件");
        filter = new FileNameExtensionFilter("Txt Files", "txt", "*.*");
        chooser.setFileFilter(filter);
        int returnVal = chooser.showSaveDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {//确定保存了
            String filePath = chooser.getSelectedFile().getAbsolutePath();
            String fileName = chooser.getSelectedFile().getName();
            Pattern p = Pattern.compile("(.*)+//.(txt)$");
            Matcher m = p.matcher(fileName);
            if (!m.matches()) {
                filePath = filePath + ".txt";
            }
            File f = new File(filePath);
            try {
                PrintStream ps = new PrintStream(f);
                ps.close();
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
        }
}                                           

    private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        chooser.setDialogTitle("寻找我的文件");
        filter = new FileNameExtensionFilter("Txt Files", "txt", "*.*");
        chooser.setFileFilter(filter);
        int returnVal = chooser.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            System.out.println("你已选择打开" + chooser.getSelectedFile().getName());
            String filePath = chooser.getSelectedFile().getAbsolutePath();
            File f = new File(filePath);
            InputStream is = null;
            try {
                is = new FileInputStream(f);
                int temp = 0;
                while ((temp = is.read()) != -1) {
                    System.out.println("" + (char) temp);
                }
                is.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }                                           

    private void editActionPerformed(java.awt.event.ActionEvent evt) {                                    
        mode = 3;
}                                   

    private void rectangleActionPerformed(java.awt.event.ActionEvent evt) {                                         
        mode = 2;
    }                                        

    private void fileMenuActionPerformed(java.awt.event.ActionEvent evt) {                                        
    }                                       

    // Variables declaration - do not modify
    private javax.swing.JButton circle;
    private javax.swing.JButton edit;
    private javax.swing.JMenu editMenu;
    private javax.swing.JMenuItem exitMenuItem;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JMenu helpMenu;
    private javax.swing.JMenuItem helpMenuItem;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JButton line;
    private javax.swing.JMenuBar mainMenuBar;
    private javax.swing.JButton rectangle;
    private javax.swing.JMenuItem saveMenuItem;
    private javax.swing.JToolBar toolBar;
    // End of variables declaration

    class DrawPanel extends JPanel implements MouseListener, MouseMotionListener {

        Vector lines = new Vector();
        Vector ellipses = new Vector();
        Vector rectangles = new Vector();
        int x1, y1;
        int x2, y2;
        int end = -1;
        //当鼠标pressed的时候的变量
        //直线
        int l1 = 4;//鼠标到直线两端点的距离  (大于三的任何值一下同是)
        int l2 = 4;
        int mx, my, nx, ny;//直线端点坐标
        //圆
        int rx0, ry0, rr0;//圆心和半径
        int rl1 = 4;//rl1鼠标到圆心的距离,rl2鼠标到圆的边框的距离
        int rl2 = 4;
        //矩形
        int recx1, recy1, recx2, recy2;//矩形对角顶点坐标
        int recj1, recj2, recj3, recj4;//分别对应到四条边的距离
        int recw, rech;
        //矩形
        int rx1, ry1, rx2, ry2;//矩形对角顶点坐标
        int j1, j2, j3, j4;//分别对应到四条边的距离

        public DrawPanel() {
            setBackground(Color.white);
            addMouseMotionListener(this);
            addMouseListener(this);
        }

        public void mouseDragged(MouseEvent e) {
            jLabel3.setText(String.valueOf(e.getX()));
            jLabel4.setText(String.valueOf(e.getY()));
            e.consume();
            end = -1;
            x2 = e.getX();
            y2 = e.getY();
            if (mode == 3) {
                if (l1 <= l2 && l1 <= 3) {
                    repaint();
                } else if (l2 < l1 && l2 <= 3) {
                    repaint();
                } else if (rl2 <= rl1 && rl2 <= 3) {
                    repaint();
                } else if (rl1 < rl2 && rl1 <= 3) {
                    repaint();
                } else if (recj1 <= 3) {
                    if (y1 <= recy2 && y1 >= recy1) {
                        repaint();
                    }
                } else if (recj2 <= 3) {
                    if (y1 <= recy2 && y1 >= recy1) {
                        repaint();
                    }
                } else if (recj3 <= 3) {
                    if (x1 <= recx2 && x1 >= recx1) {
                        repaint();
                    }
                } else if (recj4 <= 3) {
                    if (x1 <= recx2 && x1 >= recx1) {
                        repaint();
                    }
                } else {
                }
            } else {
                repaint();
            }
        }

        public void mouseMoved(MouseEvent e) {
            jLabel3.setText(String.valueOf(e.getX()));
            jLabel4.setText(String.valueOf(e.getY()));

            //修改模式下才去做这些判断
            if (mode == 3) {
                boolean state = false;
                //在移动过程中,当鼠标移动到直线的两个端点时鼠标发生变化,变成十字形
                if (state == false) {
                    for (Object o : lines) {
                        Rectangle rec = (Rectangle) o;
                        if (((e.getX() <= (rec.x + 3)) && (e.getX() >= (rec.x - 3))) && ((e.getY() <= (rec.y + 3)) && (e.getY() >= (rec.y - 3)))) {
                            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                            state = true;
                            break;
                        } else if (((e.getX() <= (rec.width + 3)) && (e.getX() >= (rec.width - 3))) && ((e.getY() <= (rec.height + 3)) && (e.getY() >= (rec.height - 3)))) {
                            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                            state = true;
                            break;
                        } else {
                            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                            state = false;
                        }
                    }
                }


                //在鼠标移动过程呢中,当鼠标经过圆的边框时,鼠标变成可修改的十字形,经过圆心时变成可拖拽的形状
                if (state == false) {
                    int x0, y0, r0;//圆心和半径
                    int clm = 1000000;//clm鼠标到圆心的最小距离  rlm鼠标到圆的边框的最小距离
                    int rlm = 1000000;
                    int cl, rl;
                    for (Object o : ellipses) {
                        Rectangle rec = (Rectangle) o;
                        r0 = rec.width / 2;
                        x0 = rec.x + r0;
                        y0 = rec.y + r0;
                        cl = (int) Math.sqrt((e.getX() - x0) * (e.getX() - x0) + (e.getY() - y0) * (e.getY() - y0));
                        clm = cl < clm ? cl : clm;
                        rl = Math.abs(cl - r0);
                        rlm = rl < rlm ? rl : rlm;

                    }
                    if (rlm <= 3) {
                        setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                        state = true;
                    } else if (clm <= 3) {
                        setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
                        state = true;
                    } else {
                        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                        state = false;
                    }
                }

 

                //矩形
                if (state == false) {

                    for (Object o : rectangles) {
                        Rectangle rec = (Rectangle) o;
                        rx1 = rec.x;
                        ry1 = rec.y;
                        rx2 = rec.x + rec.width;
                        ry2 = rec.y + rec.height;

                        j1 = Math.abs(e.getX() - rx1);
                        j2 = Math.abs(e.getX() - rx2);
                        j3 = Math.abs(e.getY() - ry1);
                        j4 = Math.abs(e.getY() - ry2);
//                        j1 = j1 < j2 ? j1 : j2;
//                        j3 = j3 < j4 ? j3 : j4;


                        if (j1 <= 3) {
                            if ((e.getY() < ry2) && (e.getY() > ry1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                state = true;
                                break;
                            }
                        } else if (j2 <= 3) {
                            if ((e.getY() < ry2) && (e.getY() > ry1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                state = true;
                                break;
                            }
                        } else if (j3 <= 3) {
                            if ((e.getX() < rx2) && (e.getX() > rx1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                state = true;
                                break;
                            }
                        } else if (j4 <= 3) {
                            if ((e.getX() < rx2) && (e.getX() > rx1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                state = true;
                                break;
                            }
                        } else {
                            state = false;
                        }
                    }
                }
            }
        }

        public void mousePressed(MouseEvent e) {
            jLabel6.setText("DOWN");
            e.consume();
            x1 = e.getX();
            y1 = e.getY();
            x2 = e.getX();
            y2 = e.getY();

            if (mode == 3) {
                boolean state = false;
                //直线
                if (state == false) {
                    for (Object o : lines) {
                        Rectangle rec = (Rectangle) o;
                        l1 = (int) Math.sqrt((x1 - rec.x) * (x1 - rec.x) + (y1 - rec.y) * (y1 - rec.y));
                        l2 = (int) Math.sqrt((x1 - rec.width) * (x1 - rec.width) + (y1 - rec.height) * (y1 - rec.height));
                        if (l1 <= l2 && l1 <= 3) {
                            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                            mx = rec.width;
                            my = rec.height;
                            lines.remove(rec);
                            state = true;
                            break;
                        } else if (l2 < l1 && l2 <= 3) {
                            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                            mx = rec.x;
                            my = rec.y;
                            lines.remove(rec);
                            state = true;
                            break;
                        } else {
                            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                            state = false;
                        }
                    }
                }

                //圆
                if (state == false) {
                    for (Object o : ellipses) {
                        Rectangle rec = (Rectangle) o;
                        rr0 = rec.width / 2;
                        rx0 = rec.x + rr0;
                        ry0 = rec.y + rr0;
                        rl1 = (int) Math.sqrt((x1 - rx0) * (x1 - rx0) + (y1 - ry0) * (y1 - ry0));
                        rl2 = Math.abs(rl1 - rr0);
                        if (rl2 <= rl1 && rl2 <= 3) {
                            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                            ellipses.remove(rec);
                            state = true;
                            break;
                        } else if (rl1 < rl2 && rl1 <= 3) {
                            setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
                            ellipses.remove(rec);
                            state = true;
                            break;
                        } else {
                            state = false;
                        }
                    }
                }

                //矩形
                if (state == false) {
                    for (Object o : rectangles) {
                        Rectangle rec = (Rectangle) o;
                        recx1 = rec.x;
                        recy1 = rec.y;
                        recw = rec.width;
                        rech = rec.height;
                        recx2 = rec.x + rec.width;
                        recy2 = rec.y + rec.height;

                        recj1 = Math.abs(e.getX() - recx1);
                        recj2 = Math.abs(e.getX() - recx2);
                        recj3 = Math.abs(recy1 - e.getY());
                        recj4 = Math.abs(recy2 - e.getY());

                        if (recj1 <= 3) {
                            if ((e.getY() <= recy2) && (e.getY() >= recy1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                rectangles.removeElement(rec);
                                state = true;
                                break;
                            }
                        } else if (recj2 <= 3) {
                            if ((e.getY() <= recy2) && (e.getY() >= recy1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                rectangles.removeElement(rec);
                                state = true;
                                break;
                            }
                        } else if (recj3 <= 3) {
                            if ((e.getX() <= recx2) && (e.getX() >= recx1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                rectangles.removeElement(rec);
                                state = true;
                                break;
                            }
                        } else if (recj4 <= 3) {
                            if ((e.getX() <= recx2) && (e.getX() >= recx1)) {
                                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                                rectangles.removeElement(rec);
                                state = true;
                                break;
                            }
                        } else {
                        }
                    }
                }
            }
        }

        @SuppressWarnings("unchecked")
        public void mouseReleased(MouseEvent e) {
            jLabel6.setText("UP");
            e.consume();
            end = 0;
            switch (mode) {
                case 0:
                    lines.addElement(new Rectangle(x1, y1, e.getX(), e.getY()));
                    break;
                case 1:
                    double r = Math.sqrt((e.getX() - x1) * (e.getX() - x1) + (e.getY() - y1) * (e.getY() - y1));
                    int intr = (int) r;
                    ellipses.addElement(new Rectangle(x1 - intr, y1 - intr, 2 * intr, 2 * intr));
                    break;
                case 2:
                    if ((e.getX() - x1) > 0 && (e.getY() - y1) > 0) {
                        rectangles.addElement(new Rectangle(x1, y1, e.getX() - x1, e.getY() - y1));
                    } else if ((e.getX() - x1) < 0 && (e.getY() - y1) < 0) {
                        rectangles.addElement(new Rectangle(e.getX(), e.getY(), Math.abs(e.getX() - x1), Math.abs(e.getY() - y1)));
                    } else if ((e.getX() - x1) > 0 && (e.getY() - y1) < 0) {
                        rectangles.addElement(new Rectangle(x1, e.getY(), e.getX() - x1, Math.abs(e.getY() - y1)));
                    } else if ((e.getX() - x1) < 0 && (e.getY() - y1) > 0) {
                        rectangles.addElement(new Rectangle(e.getX(), y1, Math.abs(e.getX() - x1), e.getY() - y1));
                    }
                    break;
                case 3:
                    if (l1 <= l2 && l1 <= 3) {
                        lines.addElement(new Rectangle(mx, my, e.getX(), e.getY()));
                    } else if (l2 < l1 && l2 <= 3) {
                        lines.addElement(new Rectangle(mx, my, e.getX(), e.getY()));
                    } else if (rl2 <= rl1 && rl2 <= 3) {
                        int rr = (int) Math.sqrt((e.getX() - rx0) * (e.getX() - rx0) + (e.getY() - ry0) * (e.getY() - ry0));
                        ellipses.addElement(new Rectangle(rx0 - rr, ry0 - rr, rr * 2, rr * 2));
                    } else if (rl1 < rl2 && rl1 <= 3) {
                        ellipses.addElement(new Rectangle(e.getX() - rr0, e.getY() - rr0, 2 * rr0, 2 * rr0));
                    } else if (recj1 <= 3) {
                        if (y1 <= recy2 && y1 >= recy1) {
                            if (e.getX() <= recx2) {
                                rectangles.addElement(new Rectangle(e.getX(), recy1, recx2 - e.getX(), rech));
                            } else {
                                rectangles.addElement(new Rectangle(recx2, recy1, e.getX() - recx2, rech));
                            }
                        }
                    } else if (recj2 <= 3) {
                        if (y1 <= recy2 && y1 >= recy1) {
                            if (e.getX() >= recx1) {
                                rectangles.addElement(new Rectangle(recx1, recy1, e.getX() - recx1, rech));
                            } else {
                                rectangles.addElement(new Rectangle(e.getX(), recy1, recx1 - e.getX(), rech));
                            }
                        }
                    } else if (recj3 <= 3) {
                        if (x1 <= recx2 && x1 >= recx1) {
                            if (e.getY() <= recy2) {
                                rectangles.addElement(new Rectangle(recx1, e.getY(), recw, recy2 - e.getY()));
                            } else {
                                rectangles.addElement(new Rectangle(recx1, recy2, recw, e.getY() - recy2));
                            }
                        }
                    } else if (recj4 <= 3) {
                        if (x1 <= recx2 && x1 >= recx1) {
                            if (e.getY() >= recy1) {
                                rectangles.addElement(new Rectangle(recx1, recy1, recw, e.getY() - recy1));
                            } else {
                                rectangles.addElement(new Rectangle(recx1, e.getY(), recw, recy1 - e.getY()));
                            }
                        }
                    }
                    break;
                default:
                    throw new RuntimeException();
            }
            repaint();
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }

        public void mouseClicked(MouseEvent e) {
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            switch (mode) {
                case 0:
                    if (end == -1) {
                        g.setColor(Color.red);
                        g.drawLine(x1, y1, x2, y2);
                    }
                    g.setColor(Color.black);
                    drawAll(g);
                    break;
                case 1:
                    if (end == -1) {
                        g.setColor(Color.red);
                        double r = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
                        int intr = (int) r;
                        g.drawLine(x1, y1, x2, y2);
                        g.drawOval(x1 - intr, y1 - intr, 2 * intr, 2 * intr);
                    }
                    g.setColor(Color.black);
                    drawAll(g);
                    break;
                case 2:
                    if (end == -1) {
                        g.setColor(Color.red);
                        if ((x2 - x1) > 0 && (y2 - y1) > 0) {
                            g.drawRect(x1, y1, x2 - x1, y2 - y1);
                        } else if ((x2 - x1) < 0 && (y2 - y1) < 0) {
                            g.drawRect(x2, y2, Math.abs(x2 - x1), Math.abs(y2 - y1));
                        } else if ((x2 - x1) > 0 && (y2 - y1) < 0) {
                            g.drawRect(x1, y2, x2 - x1, Math.abs(y2 - y1));
                        } else if ((x2 - x1) < 0 && (y2 - y1) > 0) {
                            g.drawRect(x2, y1, Math.abs(x2 - x1), y2 - y1);
                        }
                    }
                    g.setColor(Color.black);
                    drawAll(g);
                    break;

                case 3:
                    if (l1 <= l2 && l1 <= 3) {
                        g.setColor(Color.red);
                        g.drawLine(x2, y2, mx, my);
                    } else if (l2 < l1 && l2 <= 3) {
                        g.setColor(Color.red);
                        g.drawLine(x2, y2, mx, my);
                    } else if (rl2 <= rl1 && rl2 <= 3) {
                        g.setColor(Color.red);
                        int rr = (int) Math.sqrt((x2 - rx0) * (x2 - rx0) + (y2 - ry0) * (y2 - ry0));
                        g.drawOval(rx0 - rr, ry0 - rr, rr * 2, rr * 2);
                    } else if (rl1 < rl2 && rl1 <= 3) {
                        g.setColor(Color.red);
                        g.drawOval(x2 - rr0, y2 - rr0, 2 * rr0, 2 * rr0);
                    } else if (recj1 <= 3) {
                        if (y1 <= recy2 && y1 >= recy1) {
                            if (x2 <= recx2) {
                                g.setColor(Color.red);
                                g.drawRect(x2, recy1, recx2 - x2, rech);
                            } else {
                                g.setColor(Color.red);
                                g.drawRect(recx2, recy1, x2 - recx2, rech);
                            }
                        }

                    } else if (recj2 <= 3) {
                        if (y1 <= recy2 && y1 >= recy1) {
                            if (x2 >= recx1) {
                                g.setColor(Color.red);
                                g.drawRect(recx1, recy1, x2 - recx1, rech);
                            } else {
                                g.setColor(Color.red);
                                g.drawRect(x2, recy1, recx1 - x2, rech);
                            }
                        }

                    } else if (recj3 <= 3) {
                        if (x1 <= recx2 && x1 >= recx1) {
                            if (y2 <= recy2) {
                                g.setColor(Color.red);
                                g.drawRect(recx1, y2, recw, recy2 - y2);
                            } else {
                                g.setColor(Color.red);
                                g.drawRect(recx1, recy2, recw, y2 - recy2);
                            }
                        }

                    } else if (recj4 <= 3) {
                        if (x1 <= recx2 && x1 >= recx1) {
                            if (y2 >= recy1) {
                                g.setColor(Color.red);
                                g.drawRect(recx1, recy1, recw, y2 - recy1);
                            } else {
                                g.setColor(Color.red);
                                g.drawRect(recx1, y2, recw, recy1 - y2);
                            }
                        }

                    }
                    g.setColor(Color.BLACK);
                    drawAll(g);
                    break;
            }
        }

        private void drawAll(Graphics g) {
            for (Object r : lines) {
                Rectangle rec = (Rectangle) r;
                g.drawLine(rec.x, rec.y, rec.width, rec.height);
            }
            for (Object r : ellipses) {
                Rectangle rec = (Rectangle) r;
                g.drawOval(rec.x, rec.y, rec.width, rec.height);
            }
            for (Object r : rectangles) {
                Rectangle rec = (Rectangle) r;
                g.drawRect(rec.x, rec.y, rec.width, rec.height);
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值