java draws rectangle one way not both

前端 未结 2 1165
小蘑菇
小蘑菇 2020-11-30 16:07

hi i have some code in java that draws a rectangle, hwever itll only drag right, even if i drag left itll drag to the right, here is the code i have any help please?

相关标签:
2条回答
  • 2020-11-30 16:28

    Let's do some simple algebra.

    selection.x - e.getX()
    

    is the same as

    - (e.getX() - selection.x)
    

    so your expression is saying:

    Math.max(- (e.getX() - selection.x), e.getX() - selection.x)
    

    And since the positive version will always be bigger, it will always choose the positive answer, and thus you will never get a rectangle with a negative width/height.

    0 讨论(0)
  • 2020-11-30 16:32

    Remember, Rectangle (and Graphics#fillRect and Graphics#drawRect) won't render rectangles with negative width/heights

    You need two things...

    1. The current mouse point (or drag point in your case)
    2. The point where the mouse was first pressed (anchor or origin point)

    You should get the anchor point from the mousePressed event...

    public void mousePressed(MouseEvent e) {
        clickPoint = new Point(e.getPoint());
    }
    

    You then need to make determinations about which point is the smallest and use that as the start and which is the largest and use those for dimensions.

    public void mouseDragged(MouseEvent e) {
        int minX = Math.min(e.getX(), clickPoint.x);
        int minY = Math.min(e.getY(), clickPoint.y);
        int maxX = Math.max(e.getX(), clickPoint.x);
        int maxY = Math.max(e.getY(), clickPoint.y);
    
        selection.x = minX;
        selection.y = minY;
        selection.width = maxX - minX;
        selection.height = maxY - minY;
        repaint();
    }
    

    Selection Drag

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class SelectionExample {
    
        public static void main(String[] args) {
            new SelectionExample();
        }
    
        public SelectionExample() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            private Rectangle selection = new Rectangle();
            private Point clickPoint;
    
            public TestPane() {
                MouseAdapter ma = new MouseAdapter() {
    
                    @Override
                    public void mouseDragged(MouseEvent e) {
                        int minX = Math.min(e.getX(), clickPoint.x);
                        int minY = Math.min(e.getY(), clickPoint.y);
                        int maxX = Math.max(e.getX(), clickPoint.x);
                        int maxY = Math.max(e.getY(), clickPoint.y);
    
                        selection.x = minX;
                        selection.y = minY;
                        selection.width = maxX - minX;
                        selection.height = maxY - minY;
                        repaint();
                    }
    
                    @Override
                    public void mousePressed(MouseEvent e) {
                        clickPoint = new Point(e.getPoint());
                    }
    
                };
    
                addMouseListener(ma);
                addMouseMotionListener(ma);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                if (selection.width > 0 && selection.height > 0) {
                    g2d.setColor(new Color(0, 0, 255, 64));
                    g2d.fill(selection);
                    g2d.setColor(Color.BLUE);
                    g2d.draw(selection);
                }
                g2d.dispose();
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题