Компонент добавляется не корректно - Java

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток!

Хочу сделать так, чтобы при нажатии мышки (pressed), ведении (dragged) и затем отпускании (released) создавалась панель с нарисованной на ней фигурой (квадрат, например). Для этого сделал свой компонент панели ShapePanel:
public class ShapePanel extends JPanel
{
    Point p1, p2;
    
    public ShapePanel(Point p1, Point p2)
    {
        this.p1 = p1;
        this.p2 = p2;
        
        setLayout(null);
        setBounds(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
        setBackground(Color.BLUE);
        
        // в будущем хотелось бы его ещё и перемещать по панельке, где он будет существовать =)
        setMoveListener(this);
 
        setVisible(true);
    }
 
    @Override
    public void paint(Graphics g)
    {
        Graphics2D gg = (Graphics2D) g;
        gg.setStroke(new BasicStroke(5));
        gg.drawRect(0, 0, WIDTH, HEIGHT);
    }
        
        private void setMoveListener(final JComponent j)
    {
        j.addMouseListener(new MouseAdapter()
        {
            private Point prevLoc;
 
            @Override
            public void mousePressed(MouseEvent e)
            {
                prevLoc = e.getPoint();
            }
 
            @Override
            public void mouseDragged(MouseEvent e)
            {
                Component comp = (Component) e.getSource();
                
                comp.setLocation((int) ( comp.getX() + (e.getX()-prevLoc.getX()) ),
                        (int) ( comp.getY() + (e.getY()-prevLoc.getY())) );
                
                prevLoc = e.getPoint();
            }
 
            @Override
            public void mouseReleased(MouseEvent e)
            {
                prevLoc = null;
            }       
            
            @Override
            public void mouseEntered(MouseEvent e)
            {
                setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            }
 
            @Override
            public void mouseExited(MouseEvent e)
            {
                setBorder(null);
            }
        });
    }
}
Класс моей панели:
public class PPanel extends JPanel
{
    List<ShapePanel> list;
 
    public PPanel()
    {
        setBounds(0, 0, 600, 600);
        setBackground(Color.PINK);
        list = new ArrayList<ShapePanel>();
        MouseAction ma = new MouseAction();
        addMouseListener(ma);
        addMouseMotionListener(ma);
    }
 
    @Override
    public void paint(Graphics g)
    {
        for(ShapePanel panel : list)
            panel.repaint();
    }
 
    public void addShape(ShapePanel panel)
    {
        list.add(panel);
        add(panel);
        repaint();
    }
 
    private class MouseAction extends MouseAdapter
    {
        boolean creation = false;
        boolean move = false;
        Point p1, p2;
        ShapePanel panel = null;
 
        public MouseAction()
        {
            p1 = new Point();
            p2 = new Point();
        }
 
        @Override
        public void mousePressed(MouseEvent event)
        {
            if (!creation)
            {
                creation = true;
                p1.x = event.getX();
                p1.y = event.getY();
            }
        }
 
        @Override
        public void mouseDragged(MouseEvent event)
        {
            if (creation)
            {
                p2.x = event.getX();
                p2.y = event.getY();
            }
        }
 
        @Override
        public void mouseReleased(MouseEvent event)
        {
            if (creation)
            {
                p2.x = event.getX();
                p2.y = event.getY();
 
                ShapePanel panel = new ShapePanel(p1, p2);
                addShape(panel);
                
                creation = false;
            }
        }
    }
}
Так вот, в результате я получаю такую картинку (эти точки и есть, как я понимаю, панельки ShapePanel): Вроде бы смотрел на координаты точек Point - всё нормально, панели должны нормально рисоваться... Подскажите, пожалуйста, что не так написано? Из-за чего панели плохо добавляются?

Заранее благодарю за любые советы!

Решение задачи: «Компонент добавляется не корректно»

textual
Листинг программы
        gg.fillRect(0, 0, this.getWidth(), this.getHeight());

Оцени полезность:

14   голосов , оценка 4.357 из 5
Похожие ответы