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

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

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

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

Хочу сделать так, чтобы при нажатии мышки (pressed), ведении (dragged) и затем отпускании (released) создавалась панель с нарисованной на ней фигурой (квадрат, например). Для этого сделал свой компонент панели ShapePanel:
Листинг программы
  1. public class ShapePanel extends JPanel
  2. {
  3. Point p1, p2;
  4. public ShapePanel(Point p1, Point p2)
  5. {
  6. this.p1 = p1;
  7. this.p2 = p2;
  8. setLayout(null);
  9. setBounds(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
  10. setBackground(Color.BLUE);
  11. // в будущем хотелось бы его ещё и перемещать по панельке, где он будет существовать =)
  12. setMoveListener(this);
  13. setVisible(true);
  14. }
  15. @Override
  16. public void paint(Graphics g)
  17. {
  18. Graphics2D gg = (Graphics2D) g;
  19. gg.setStroke(new BasicStroke(5));
  20. gg.drawRect(0, 0, WIDTH, HEIGHT);
  21. }
  22. private void setMoveListener(final JComponent j)
  23. {
  24. j.addMouseListener(new MouseAdapter()
  25. {
  26. private Point prevLoc;
  27. @Override
  28. public void mousePressed(MouseEvent e)
  29. {
  30. prevLoc = e.getPoint();
  31. }
  32. @Override
  33. public void mouseDragged(MouseEvent e)
  34. {
  35. Component comp = (Component) e.getSource();
  36. comp.setLocation((int) ( comp.getX() + (e.getX()-prevLoc.getX()) ),
  37. (int) ( comp.getY() + (e.getY()-prevLoc.getY())) );
  38. prevLoc = e.getPoint();
  39. }
  40. @Override
  41. public void mouseReleased(MouseEvent e)
  42. {
  43. prevLoc = null;
  44. }
  45. @Override
  46. public void mouseEntered(MouseEvent e)
  47. {
  48. setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
  49. }
  50. @Override
  51. public void mouseExited(MouseEvent e)
  52. {
  53. setBorder(null);
  54. }
  55. });
  56. }
  57. }
Класс моей панели:
Листинг программы
  1. public class PPanel extends JPanel
  2. {
  3. List<ShapePanel> list;
  4. public PPanel()
  5. {
  6. setBounds(0, 0, 600, 600);
  7. setBackground(Color.PINK);
  8. list = new ArrayList<ShapePanel>();
  9. MouseAction ma = new MouseAction();
  10. addMouseListener(ma);
  11. addMouseMotionListener(ma);
  12. }
  13. @Override
  14. public void paint(Graphics g)
  15. {
  16. for(ShapePanel panel : list)
  17. panel.repaint();
  18. }
  19. public void addShape(ShapePanel panel)
  20. {
  21. list.add(panel);
  22. add(panel);
  23. repaint();
  24. }
  25. private class MouseAction extends MouseAdapter
  26. {
  27. boolean creation = false;
  28. boolean move = false;
  29. Point p1, p2;
  30. ShapePanel panel = null;
  31. public MouseAction()
  32. {
  33. p1 = new Point();
  34. p2 = new Point();
  35. }
  36. @Override
  37. public void mousePressed(MouseEvent event)
  38. {
  39. if (!creation)
  40. {
  41. creation = true;
  42. p1.x = event.getX();
  43. p1.y = event.getY();
  44. }
  45. }
  46. @Override
  47. public void mouseDragged(MouseEvent event)
  48. {
  49. if (creation)
  50. {
  51. p2.x = event.getX();
  52. p2.y = event.getY();
  53. }
  54. }
  55. @Override
  56. public void mouseReleased(MouseEvent event)
  57. {
  58. if (creation)
  59. {
  60. p2.x = event.getX();
  61. p2.y = event.getY();
  62. ShapePanel panel = new ShapePanel(p1, p2);
  63. addShape(panel);
  64. creation = false;
  65. }
  66. }
  67. }
  68. }
Так вот, в результате я получаю такую картинку (эти точки и есть, как я понимаю, панельки ShapePanel): Вроде бы смотрел на координаты точек Point - всё нормально, панели должны нормально рисоваться... Подскажите, пожалуйста, что не так написано? Из-за чего панели плохо добавляются?

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

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

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

14   голосов , оценка 4.357 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы