Рисование каждого прямоугольника по щелчку мыши вместо setLocation

В настоящее время этот сегмент кода перемещает текущий прямоугольник, уже нарисованный на кадре, щелчком мыши. Координаты этого клика переходят в переменные x и y. Везде, где щелкают по рамке, прямоугольник перемещается в это место. Я хочу, чтобы вместо этого он просто рисовал новый прямоугольник, поэтому, например, когда я нажимаю 10 раз случайным образом на экране, будет 10 прямоугольников. Как ты это делаешь?

public void moveRectangleTo(int x, int y)
       {
          box.setLocation(x, y);
          repaint();      
       }

ПОЛНЫЙ КОД: класс RectangleComponent

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;

public class RectangleComponent2 extends JComponent
{
   private static final int BOX_X = 100;
   private static final int BOX_Y = 100;
   private static final int BOX_WIDTH = 20;
   private static final int BOX_HEIGHT = 30;

   private Rectangle box;

   public RectangleComponent2()
   {  
      box = new Rectangle(BOX_X, BOX_Y, BOX_WIDTH, BOX_HEIGHT);         
   }

   public void paintComponent(Graphics g)
   {  
      Graphics2D g2 = (Graphics2D) g;

      g2.draw(box);
   }

   public void moveRectangleTo(int x, int y)
   {
      box.setLocation(x, y);
      repaint();      
   }
}

Прямоугольный каркас класса:

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;

public class RectangleFrame2 extends JFrame {
   private static final int FRAME_WIDTH = 300;
   private static final int FRAME_HEIGHT = 400;
   private RectangleComponent2 scene;

   class MousePressListener implements MouseListener {  
      public void mousePressed(MouseEvent event) {  
         int x = event.getX();
         int y = event.getY();
         scene.moveRectangleTo(x, y);
      }
      public void mouseReleased(MouseEvent event) {}
      public void mouseClicked(MouseEvent event) {}
      public void mouseEntered(MouseEvent event) {}
      public void mouseExited(MouseEvent event) {}
   }

   public RectangleFrame2() {
      scene = new RectangleComponent2();
      add(scene);

      setSize(FRAME_WIDTH, FRAME_HEIGHT);

      MouseListener listener = new MousePressListener();
      scene.addMouseListener(listener);
   }
} 

1 ответ

Решение

Вам нужно вести список ящиков.

private List<Rectangle> boxes = new ArrayList<>();

По щелчку мыши, вместо перемещения поля, добавьте новый:

public void addRectangleAt(int x, int y)
   {
      Rectangle boxNew = new Rectangle(x, y, BOX_WIDTH, BOX_HEIGHT);
      boxes.add(boxNew);
      repaint();      
   }

Тогда в вашем paintComponent() метод, переберите список ящиков и нарисуйте каждый.

Другие вопросы по тегам