【问题标题】:Draw varying size rectangle with different orientation using rectangle 2D使用矩形 2D 绘制具有不同方向的不同大小的矩形
【发布时间】:2014-06-04 16:31:02
【问题描述】:

我想在 Java 应用程序中绘制一个矩形。我已经使用 rectangle2d 来绘制一个矩形。我需要矩形根据鼠标拖动来改变大小。即矩形的大小随着我拖动鼠标而变化。我目前只能绘制一种类型的矩形,即当我将鼠标拖到屏幕的右下方时。但我无法绘制其他矩形。例如。当鼠标拖动到屏幕的右上角时。我正在使用一种名为 setRect 的方法,它采用矩形的左上 x 和 y 坐标。但是因为当我在左上角拖动鼠标时,我的左上角和右上角发生了变化,我的矩形扭曲了。

我已尽力用文字来解释这一点。如果您对问题有任何疑问,请打开 MS 绘图应用程序或任何其他绘图应用程序,选择一个矩形并向各个方向移动鼠标,当鼠标向上左、右上、下拖动时,可以看到矩形的 4 个不同方向左下右下。其中,当左上坐标保持不变时,我只能画一个。有什么函数可以用来绘制其余三个矩形方向

【问题讨论】:

    标签: java swing graphics awt


    【解决方案1】:

    假设您使用从mousePressedmouseDragged MouseEvent 获得的两组Points,这里需要考虑。

    把它分解成更小的部分。从象限的角度来看它(中心的 O 是从 mousePressed 收集的初始 Point

               Quadrants
    +--------------+---------------+
    |              |               |
    |              |               |
    |      I       |       II      |
    |              |               |
    |              |               |
    +--------------O---------------+
    |              |               |
    |              |               |
    |     IV       |      III      |
    |              |               |
    |              |               |
    +--------------+---------------+
    

    当您拖动鼠标时,从mouseDragged 获得的第二个Point 将位于I、II、III 或IV 象限中。

    所以我再说一遍......把它分解成更小的部分。

    如果第二个点在第一象限,你将如何绘制矩形?

    • 点 2 将成为绘制的初始点。所以你必须使用

      来切换绘图点
      // original
      setRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
      
      // change to
      setRect(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y);
      

      你可以用逻辑来检查在哪个象限点,比如

      public boolean isPointTwoInQuadOne(Point p1, Point p2) {
          return p1.x >= p2.x && p1.y >= p2.y;
      }
      

    希望对您有所帮助,或者至少可以帮助您从不同的角度看待问题:)


    这是一个正在运行的示例。我为你找出了第一象限,你似乎已经知道第三象限了,所以我把它留给你,图二和四;-)

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.geom.Rectangle2D;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class RectangleDrawWithDrag extends JPanel{
        private static final int D_W = 500;
        private static final int D_H = 500;
    
        private Point p1;
        private Point p2;
        private Rectangle2D rectangle;
    
        public RectangleDrawWithDrag() {
            addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent e) {
                    p1 = e.getPoint();
                    rectangle = new Rectangle2D.Double(p1.x, p1.y, p1.x - p1.x, p1.y - p1.y);
                }
            });
            addMouseMotionListener(new MouseMotionAdapter(){
                public void mouseDragged(MouseEvent e) {
                    p2 = e.getPoint();
                    if (isPointTwoInQuadOne(p1, p2)) {
                        rectangle.setRect(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y);
                    } else {
                        rectangle.setRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
                    }
    
                    repaint();
                }
            });
        }
    
        public boolean isPointTwoInQuadOne(Point p1, Point p2) {
            return p1.x >= p2.x && p1.y >= p2.y;
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            if (rectangle != null) {
                g2.fill(rectangle);
            }
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(D_W, D_H);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new RectangleDrawWithDrag());
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

    • 谢谢!我遵循相同的方法。但是我犯错误的地方是我没有存储原始点1。因此我无法绘制其他象限。感谢您的帮助。
    【解决方案2】:

    查看Custom Painting Approaches 了解两种常见的绘画方式:

    1. 来自对象的 ArrayList
    2. 在 BufferedImage 上

    该示例展示了如何绘制多个任意大小和不同颜色的矩形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      相关资源
      最近更新 更多