簡體   English   中英

如何通過拖動鼠標繪制上下顛倒的正方形?

[英]How to draw an upsidedown square by dragging mouse?

如何使用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);
               }
           }
       }
   }

請幫我

問題圖片

因為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();
           }

首先,不要使用數組存儲要繪制的Rectangle對象。 使用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中

有關實現上述建議的工作示例,請參見“ 自定義繪畫方法”中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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM