2016-06-02 3 views
-1

Я пытаюсь сделать изменить размер a Rectangle2D используя метод перетаскивания мышью. Кроме того, я хочу рекуператор он находится в середине JPanel. Я думаю, что код и формулы верны, но он не работает должным образом, потому что слишком сильно изменяет размер прямоугольника, и он не подходит под курсором.Невозможно изменить размер Rectangle2D в соответствии с курсором

Здесь я отправлю соответствующие коды.

Конструктор

public Canvas(double width, double height) { 
    this.width = width; 
    this.height = height; 

    rect = new Rectangle2D.Double(this.x, this.y, this.width, this.height); 
    vertex = new Rectangle2D[4]; 

    this.addMouseMotionListener(this); 
    this.addMouseListener(this); 
} 

vertex является массивом Rectangle2D, нарисованного к вершинам прямоугольника, только если указатель мыши находится внутри

paintComponent:

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    //RETTANGOLO 
    Graphics2D g2 = (Graphics2D)g; 
    Stroke oldStroke = g2.getStroke(); 
    g2.setStroke(new BasicStroke(SPESSORE)); 
    g2.draw(rect); 
    g2.setStroke(oldStroke); 
    g2.setColor(Color.BLACK); 

    setAtCenter(); 

    //VERTICI 
    vertex[0] = new Rectangle2D.Double(this.x, this.y, SIZEV, SIZEV); 
    vertex[1] = new Rectangle2D.Double(this.x + this.width - SIZEV, 
             this.y, SIZEV, SIZEV); 
    vertex[2] = new Rectangle2D.Double(this.x, this.y + this.height - SIZEV, 
             SIZEV, SIZEV); 
    vertex[3] = new Rectangle2D.Double(this.x + this.width - SIZEV, 
             this.y + this.height - SIZEV, 
             SIZEV, SIZEV); 
    if (dentro) { 
     for (int i = 0; i < 4; i++) { 
      g2.draw(vertex[i]); 
     } 
    } 
} 

private void setAtCenter() { 
    this.x = ((this.getWidth()/2) - (this.width/2)); 
    this.y = ((this.getHeight()/2) - (this.height/2)); 
    rect.setRect(x, y, this.width, this.height); 
} 

mouseMoved:

@Override 
public void mouseMoved(MouseEvent e) { 
    dentro = false; 
    inVertex = -1; 
    if (rect.contains(e.getPoint())) { 
     dentro = true; 
    } 
    for (int i = 0; i < 4; i++) { 
     if (vertex[i].contains(e.getPoint())) { 
      inVertex = i; 
      break; 
     } 
    } 
} 

mousePressed:

@Override 
public void mousePressed(MouseEvent e) { 
    if (inVertex >= 0) { 
     this.startX = e.getX(); 
     this.startY = e.getY(); 
    } 
} 

mouseDragged:

@Override 
public void mouseDragged(MouseEvent e) { 
    double dX; 
    double dY; 
    if (inVertex >= 0) { 
     this.endX = e.getX(); 
     this.endY = e.getY(); 
     dX = startX - endX; 
     dY = startY - endY; 
     this.width += dX; 
     this.height += dY; 
     this.repaint(); 
    } 
} 

Я надеюсь, что я отправил все необходимую информацию и, наконец, кто-то поможет мне для решения этой проблемы, одолжил меня.

EDIT: Я решил проблему, отслеживая положение вершин, задав соответственно ширину и высоту. Я упростил код, позволяющий изменять размер только из исходной вершины. Спасибо за поддержку.

Спасибо всем!

ответ

1

mouseDragged() будет называться повторно. В вашей текущей реализации каждый раз, когда вызывается mouseDragged(), вы добавляете все расстояние снова и снова, вместо того, чтобы просто добавлять то, что было изменено с момента последнего вызова mouseDragged().

this.width += dX; 
    this.height += dY; 

Быстрое исправление было бы сохранить текущую позицию в startX и startY каждый раз mouseDragged() называется.

@Override 
public void mouseDragged(MouseEvent e) { 
    double dX; 
    double dY; 
    if (inVertex >= 0) { 
     this.endX = e.getX(); 
     this.endY = e.getY(); 
     dX = startX - endX; 
     dY = startY - endY; 
     this.width += dX; 
     this.height += dY; 

     this.startX = this.endX; 
     this.startY = this.endY; 

     this.repaint(); 
    } 
} 

Но это сложение поэтапных изменений в размере - странный подход. Вероятно, вам лучше будет просто отслеживать, какая вершина захвачена, а затем обновить ее позицию. Затем нарисуйте свою фигуру на основе положений вершин, не отслеживая изменения размера, то есть размер прямоугольника неявно зависит от положения ваших вершин.

+0

Я пробовал ваше решение, и теперь изменение размера замедляется по сравнению с позицией курсора.Поэтому я попытаюсь следовать вашим советам и отслеживать каждую позицию вершин и каждый раз перерисовывать прямоугольник в зависимости от положения вершин. Но я надеюсь, что он будет работать с моим методом 'setAtCenter()' – Shafa95

+0

. Я решил проблему, отслеживая положение вершин, задав соответственно ширину и высоту. Я упростил код, позволяющий изменять размер только из исходной вершины. Спасибо за поддержку. – Shafa95