Как нарисовать квадрат вверх, перетаскивая мышью? - PullRequest
0 голосов
/ 19 ноября 2018

Как я могу нарисовать перевернутый прямоугольник в Java, используя качели?

Используя метод g.drawRect (x, y, width, height), создание прямоугольника путем перетаскивания мышью прошло успешно, но произошла небольшая ошибка.

Если вы перетащите вточка (x2, y2 | x2> x1 && y2> y1) больше, чем первая точка (x, y), будет работать нормально.

Однако, в противном случае, если координаты перетаскиванияточка меньше, чем координаты первой точки щелчка, она рисуется в противоположном направлении, а не в направлении точки перетаскивания.

Даже если бы я попытался нарисовать ее в обратном направлении, если (), я не смог бывыяснить, что делать.

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

↓ Вот мой код

   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);
               }
           }
       }
   }

, пожалуйста, помогите мне

Проблемное изображение

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Прежде всего, не используйте массив для хранения объектов Rectangle, которые вы хотите нарисовать.Используйте ArrayList, он будет расти динамически, если вы хотите рисовать больше прямоугольников.

Проблема с вашим текущим кодом состоит в том, что вы пытаетесь обновить значения x / y / width / height в 3 отдельных методах.Это должно быть сделано только методом mouseDragged.

Основные шаги:

  1. в mousePressed Вы сохраняете начальную точку мыши.Создайте пустой объект Rectangle, который будет использоваться для рисования прямоугольника
  2. в mouseDragged, вы сравниваете начальную точку мыши с текущей точкой мыши и определяете минимальные значения x / y.Затем вы получите абсолютное значение для значений x и y отдельно, чтобы вы знали ширину / высоту прямоугольника.Обновите значения x / y / width / height вашего объекта Rectangle и перекрасьте 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;
    }
}
0 голосов
/ 19 ноября 2018

потому что ary[i].x и 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());
               // 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();
           }
...