javaswingdrawrect

Java swing draw rectangle in mouse drag and drop


I am creating a rectangular drawing program.The square is drawn only if the program is dragging to the bottom side. Even if dragging in the other direction, I want to ensure that squares are drawn correctly. How can I fix it? Please help me.

**DrawRect.java**


    import javax.swing.*;

    import java.awt.*;

    import java.awt.event.*;

    public class DrawRect extends JPanel {

        int x, y, w, h;
        public static void main(String [] args) { 
            JFrame f = new JFrame("Draw Box Mouse 2");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            f.setContentPane(new DrawRect());
            f.setSize(300, 300); f.setVisible(true);
        }



        DrawRect() { 
            x = y = w = h = 0; // 
            MyMouseListener listener = new MyMouseListener(); 
            addMouseListener(listener); 
            addMouseMotionListener(listener);    
        }

        public void setStartPoint(int x, int y) {
            this.x = x; this.y = y;
        }

        public void setEndPoint(int x, int y) { 
            w = Math.abs(this.x - x); 
            h = Math.abs(this.y - y); 
        }

        class MyMouseListener extends MouseAdapter {
            public void mousePressed(MouseEvent e) {
                setStartPoint(e.getX(), e.getY());
            } 
            public void mouseDragged(MouseEvent e) { 
                setEndPoint(e.getX(), e.getY()); repaint(); 
            } 
            public void mouseReleased(MouseEvent e) {
                setEndPoint(e.getX(), e.getY()); repaint(); 
            } 
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED); 

Please help me.
            g.drawRect(x, y, w, h); 

        }



    }

Solution

  • Try something like this. you have to determine start point carefully.start point is the min x and y points of 1st and last mouse coordinates.

    here is the steps to solve this problem

    1. take first coordinate when mouse clicke x,y
    2. take last coordinates when mouse drag x2,y2
    3. take min x and y coordinates as startpoint for drawRect Math.min(x,x2);
    4. use absolute value of coordinate difference to calculate height and width of rectangle. Math.abs(x-x2);

    code

    import javax.swing.*;
    
    import java.awt.*;
    
    import java.awt.event.*;
    
        public class DrawRect extends JPanel {
    
            int x, y, x2, y2;
    
            public static void main(String[] args) {
                JFrame f = new JFrame("Draw Box Mouse 2");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane(new DrawRect());
                f.setSize(300, 300);
                f.setVisible(true);
            }
    
            DrawRect() {
                x = y = x2 = y2 = 0; // 
                MyMouseListener listener = new MyMouseListener();
                addMouseListener(listener);
                addMouseMotionListener(listener);
            }
    
            public void setStartPoint(int x, int y) {
                this.x = x;
                this.y = y;
            }
    
            public void setEndPoint(int x, int y) {
                x2 = (x);
                y2 = (y);
            }
    
            public void drawPerfectRect(Graphics g, int x, int y, int x2, int y2) {
                int px = Math.min(x,x2);
                int py = Math.min(y,y2);
                int pw=Math.abs(x-x2);
                int ph=Math.abs(y-y2);
                g.drawRect(px, py, pw, ph);
            }
    
            class MyMouseListener extends MouseAdapter {
    
                public void mousePressed(MouseEvent e) {
                    setStartPoint(e.getX(), e.getY());
                }
    
                public void mouseDragged(MouseEvent e) {
                    setEndPoint(e.getX(), e.getY());
                    repaint();
                }
    
                public void mouseReleased(MouseEvent e) {
                    setEndPoint(e.getX(), e.getY());
                    repaint();
                }
            }
    
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.RED);
                drawPerfectRect(g, x, y, x2, y2);
            }
    
        }