Перемещение компонентов и некорректное их отображение - Java

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

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

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

Делаю простое приложение, где при нажатии, ведению мышки и отпускании добавляется панель (ShapePanel), на которой рисуется фигура (в данном случае - прямоугольник). Есть несколько проблем: 1) При добавлении на панель новой фигуры (т.е. панели с фигурой на ней) фон получается "прозрачным", хотя в конфигурации класса (ShapePanel) прописан СИНИЙ цвет. Что влияет на подобный результат и как это "исправить"?) 2) Также пытаюсь написать механизм перемещения фигур (т.е. панелей с фигурами) мышкой. Проблема в том, что обработчик не заходит в mouseDragged метод (что является жизненно важным для механизма перетаскивания). Почему?

Буду рад любым идеям и советам по улучшению следующего кода!

Класс общей (главной) панели:
Листинг программы
  1. public class PPanel extends JPanel
  2. {
  3. public PPanel()
  4. {
  5. setLayout(null);
  6. setBounds(0, 0, 600, 600);
  7. setBackground(Color.PINK);
  8. MouseAction ma = new MouseAction();
  9. addMouseListener(ma);
  10. addMouseMotionListener(ma);
  11. add(new ShapePanel(new Point(20,20), new Point(100,100)));
  12. }
  13. public void createShape(ShapePanel panel)
  14. {
  15. add(panel);
  16. //repaint();
  17. //invalidate();
  18. updateUI();
  19. }
  20. private class MouseAction extends MouseAdapter
  21. {
  22. boolean creation = false;
  23. Point p1, p2;
  24. public MouseAction()
  25. {
  26. p1 = new Point();
  27. p2 = new Point();
  28. }
  29. @Override
  30. public void mousePressed(MouseEvent event)
  31. {
  32. if (!creation)
  33. {
  34. creation = true;
  35. p1.x = event.getX();
  36. p1.y = event.getY();
  37. }
  38. }
  39. @Override
  40. public void mouseDragged(MouseEvent event)
  41. {
  42. if (creation)
  43. {
  44. p2.x = event.getX();
  45. p2.y = event.getY();
  46. }
  47. }
  48. @Override
  49. public void mouseReleased(MouseEvent event)
  50. {
  51. if (creation)
  52. {
  53. p2.x = event.getX();
  54. p2.y = event.getY();
  55. createShape(new ShapePanel(p1, p2));
  56. creation = false;
  57. }
  58. }
  59. }
  60. }
Класс панели с фигурой (которые добавляются на основную панель):
Листинг программы
  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. setMoveListener(this);
  12. setVisible(true);
  13. }
  14. @Override
  15. public void paint(Graphics g)
  16. {
  17. Graphics2D gg = (Graphics2D) g;
  18. gg.setStroke(new BasicStroke(5));
  19. gg.drawRect(0, 0, this.getWidth(), this.getHeight());
  20. }
  21. private void setMoveListener(final JComponent j)
  22. {
  23. j.addMouseListener(new MouseAdapter()
  24. {
  25. private Point currPos;
  26. private Point mousePos;
  27. private Component comp;
  28. @Override
  29. public void mousePressed(MouseEvent e)
  30. {
  31. //prevLoc = e.getPoint();
  32. comp = (Component) e.getSource();
  33. mousePos = comp.getParent().getMousePosition();
  34. //currPos = comp.getLocation();
  35. }
  36. @Override
  37. public void mouseDragged(MouseEvent e)
  38. {
  39. /*Component comp = (Component) e.getSource();
  40. comp.setLocation((int) ( comp.getX() + (e.getX()-prevLoc.getX()) ),
  41. (int) ( comp.getY() + (e.getY()-prevLoc.getY())) );
  42. prevLoc = e.getPoint();*/
  43. currPos = comp.getLocation();
  44. Container c = comp.getParent();
  45. Point mouse = c.getMousePosition();
  46. if (mouse.x > mousePos.x)
  47. currPos.x++;
  48. else if (mouse.x < mousePos.x)
  49. currPos.x--;
  50. if (mouse.y > mousePos.y)
  51. currPos.y++;
  52. else if (mouse.y < mousePos.y)
  53. currPos.y--;
  54. mousePos = mouse;
  55. }
  56. @Override
  57. public void mouseReleased(MouseEvent e)
  58. {
  59. //prevLoc = null;
  60. comp.setLocation(currPos);
  61. comp = null;
  62. currPos = null;
  63. }
  64. });
  65. }
  66. }
Код фрейма:
Листинг программы
  1. public class PFrame extends JFrame
  2. {
  3. public PFrame()
  4. {
  5. setLayout(null);
  6. setDefaultCloseOperation(EXIT_ON_CLOSE);
  7. setBounds(100, 100, 600, 600);
  8. add(new PPanel());
  9. setVisible(true);
  10. }
  11. }

Решение задачи: «Перемещение компонентов и некорректное их отображение»

textual
Листинг программы
  1. import javax.swing.*;
  2.  
  3. public class PFrame extends JFrame
  4. {
  5.     public PFrame()
  6.     {
  7.         setLayout(null);
  8.         setDefaultCloseOperation(EXIT_ON_CLOSE);
  9.         setBounds(100, 100, 600, 600);
  10.        
  11.         add(new PPanel());
  12.        
  13.         setVisible(true);
  14.     }
  15.  
  16.     public static void main(String[] args) {
  17.         SwingUtilities.invokeLater(new Runnable() {
  18.             @Override
  19.             public void run() {
  20.                 new PFrame();
  21.             }
  22.         });
  23.     }
  24. }

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


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

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

6   голосов , оценка 4.167 из 5

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

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

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