【问题标题】:How to draw an upsidedown square by dragging mouse?如何通过拖动鼠标绘制一个倒置的正方形?
【发布时间】:2019-04-21 14:27:55
【问题描述】:

如何使用 Swing 在 Java 中绘制倒置矩形?

使用 'g.drawRect(x,y,width,height)' 方法, 鼠标拖拽创建矩形成功,但出现了小错误。

如果拖动到比第一个点(x,y)大的点(x2,y2| x2>x1 && y2>y1),它将正常运行。

但是,反之,如果拖动点的坐标小于第一个点击点的坐标,则向相反的方向绘制,而不是向拖动点方向。

即使我试图通过 if() 来反转它,我也不知道该怎么做。

我想要的方向就像Window中的一个拖动框,但是对我来说有点难。 请给我一些提示来克服这次艰难的旅程。

↓这是我的代码

   class Rect {
            int x, y, w, h;
   }

   public class Rectangle extends JPanel{
            int i = 0;
       int x, y = 0;
       Rect [] ary = new Rect[100];
       public Rectangle() {
           addMouseListener(new MouseListener() {
               public void mouseClicked(MouseEvent e) {}
               public void mouseEntered(MouseEvent e) {}
               public void mouseExited(MouseEvent e) {}
               public void mousePressed(MouseEvent e) {
                   if(i>100) return;
                   ary[i] = new Rect();
                   ary[i].x = e.getX(); ary[i].y = e.getY();
                   x= ary[i].x; y = ary[i].y;
               }

               @Override
               public void mouseReleased(MouseEvent e) {
                   ary[i].w = Math.abs(ary[i].x-e.getX()); 
                        ary[i].h = Math.abs(ary[i].y- e.getY());
                   i++;
                   repaint();
               }
           });

           addMouseMotionListener(new MouseMotionListener() {
               @Override
               public void mouseDragged(MouseEvent e) {
                   ary[i].w = Math.abs(ary[i].x-e.getX()); 
                   ary[i].h = Math.abs(ary[i].y- e.getY());
                   repaint();
               }
               public void mouseMoved(MouseEvent e) {
               }
           });
       }

       public void paintComponent(Graphics g) {
           super.paintComponent(g);
           for(Rect r:ary){
               if(r !=null) {
                   g.setColor(Color.BLACK);
                   g.drawRect(r.x, r.y, r.w, r.h);
               }
           }
       }
   }

请帮帮我

Problem image

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 啊..!我会解决的谢谢XD
  • 使用帖子下方的edit 按钮对其进行更改。这样可以避免覆盖其他人所做的改进!
  • 非常感谢!!感谢您的意见,我可以附上问题的图像并简化代码。
  • “我可以……简化代码” 不,你误解了 MCVE / SSCCE 是什么。需要将代码添加到那里,使其成为 MCVE / SSCCE。例如。导入和主要方法..

标签: java swing awt java-2d


【解决方案1】:

首先不要使用数组来存储要绘制的矩形对象。使用 ArrayList 它会随着您想要绘制更多矩形而动态增长。

您当前代码的问题是您试图用 3 种不同的方法更新 x/y/width/height 值。这只能在mouseDragged 方法中完成。

基本步骤是:

  1. mousePressed 中保存初始鼠标点。创建一个空的 Rectangle 对象用于绘制矩形
  2. mouseDragged 中,您将初始鼠标点与当前鼠标点进行比较并确定最小x/y 值。然后,您分别获得 x 和 y 值的绝对值,以便知道矩形的宽度/高度。更新 Rectangle 对象的 x/y/width/height 值并重新绘制 Rectangle
  3. mouseReleased 中,将 Rectangle 对象添加到 ArrayList

请参阅Custom Painting Approaches 中的DrawOnComponent 示例,了解实现上述建议的工作示例。

上述示例中的 MouseInputAdapter 实现如下。它显示了 mouseDragged 方法中的大部分逻辑:

class MyMouseListener extends MouseInputAdapter
{
    private Point startPoint;

    public void mousePressed(MouseEvent e)
    {
        startPoint = e.getPoint();
        shape = new Rectangle();
    }

    public void mouseDragged(MouseEvent e)
    {
        int x = Math.min(startPoint.x, e.getX());
        int y = Math.min(startPoint.y, e.getY());
        int width = Math.abs(startPoint.x - e.getX());
        int height = Math.abs(startPoint.y - e.getY());

        shape.setBounds(x, y, width, height);
        repaint();
    }

    public void mouseReleased(MouseEvent e)
    {
        if (shape.width != 0 || shape.height != 0)
        {
            addRectangle(shape, e.getComponent().getForeground());
        }

        shape = null;
    }
}

【讨论】:

  • 哇...还有另一种获取矩形形状的方法,称为 setBounds()。由于您的友好和简单的解释,我很容易理解。非常感谢您,祝您有愉快的一天。
  • 哇,在调用 Rectangular() 类并使用 setBounds() 方法之前,我已经可以绘制一个我想要的矩形了,只是在坐标比较中 x,y 的值很小单击点和当前拖动鼠标。我真的很感激你给我的提示,所以我可以得到我真正想要的答案。非常感谢ㅠㅠ
【解决方案2】:

因为ary[i].xary[i].y必须是新闻发布坐标中的最小值:

           @Override
           public void mouseReleased(MouseEvent e) {
               ary[i].w = Math.abs(ary[i].x-e.getX()); 
               ary[i].h = Math.abs(ary[i].y- e.getY());
               // upper left point
               ary[i].x = Math.min(ary[i].x,e.getX()); 
               ary[i].y = Math.min(ary[i].y,e.getY()); 
               i++;
               repaint();
           }

【讨论】:

  • 那么..如何使用g.drawRect()或其他方法如Polygon制作起点小于终点坐标的矩形?
  • 根据drawRect的定义,x,y必须是矩形的左上点。你试过我的建议了吗?这不是你需要的吗?如果不解释。
  • 好吧,如果它比 x 坐标的取值点大,我尝试反转 x 和 width 的值,但没有固定点。
  • 我很抱歉解释如此令人沮丧。
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
相关资源
最近更新 更多