Перемещение компонентов и некорректное их отображение - Java
Формулировка задачи:
Доброго времени суток!
Делаю простое приложение, где при нажатии, ведению мышки и отпускании добавляется панель (ShapePanel), на которой рисуется фигура (в данном случае - прямоугольник). Есть несколько проблем: 1) При добавлении на панель новой фигуры (т.е. панели с фигурой на ней) фон получается "прозрачным", хотя в конфигурации класса (ShapePanel) прописан СИНИЙ цвет. Что влияет на подобный результат и как это "исправить"?) 2) Также пытаюсь написать механизм перемещения фигур (т.е. панелей с фигурами) мышкой. Проблема в том, что обработчик не заходит в mouseDragged метод (что является жизненно важным для механизма перетаскивания). Почему?Буду рад любым идеям и советам по улучшению следующего кода!
Класс общей (главной) панели:
Листинг программы
- public class PPanel extends JPanel
- {
- public PPanel()
- {
- setLayout(null);
- setBounds(0, 0, 600, 600);
- setBackground(Color.PINK);
- MouseAction ma = new MouseAction();
- addMouseListener(ma);
- addMouseMotionListener(ma);
- add(new ShapePanel(new Point(20,20), new Point(100,100)));
- }
- public void createShape(ShapePanel panel)
- {
- add(panel);
- //repaint();
- //invalidate();
- updateUI();
- }
- private class MouseAction extends MouseAdapter
- {
- boolean creation = false;
- Point p1, p2;
- 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();
- createShape(new ShapePanel(p1, p2));
- creation = false;
- }
- }
- }
- }
Листинг программы
- 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, this.getWidth(), this.getHeight());
- }
- private void setMoveListener(final JComponent j)
- {
- j.addMouseListener(new MouseAdapter()
- {
- private Point currPos;
- private Point mousePos;
- private Component comp;
- @Override
- public void mousePressed(MouseEvent e)
- {
- //prevLoc = e.getPoint();
- comp = (Component) e.getSource();
- mousePos = comp.getParent().getMousePosition();
- //currPos = comp.getLocation();
- }
- @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();*/
- currPos = comp.getLocation();
- Container c = comp.getParent();
- Point mouse = c.getMousePosition();
- if (mouse.x > mousePos.x)
- currPos.x++;
- else if (mouse.x < mousePos.x)
- currPos.x--;
- if (mouse.y > mousePos.y)
- currPos.y++;
- else if (mouse.y < mousePos.y)
- currPos.y--;
- mousePos = mouse;
- }
- @Override
- public void mouseReleased(MouseEvent e)
- {
- //prevLoc = null;
- comp.setLocation(currPos);
- comp = null;
- currPos = null;
- }
- });
- }
- }
Код фрейма:
Листинг программы
- public class PFrame extends JFrame
- {
- public PFrame()
- {
- setLayout(null);
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setBounds(100, 100, 600, 600);
- add(new PPanel());
- setVisible(true);
- }
- }
Решение задачи: «Перемещение компонентов и некорректное их отображение»
textual
Листинг программы
- import javax.swing.*;
- public class PFrame extends JFrame
- {
- public PFrame()
- {
- setLayout(null);
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setBounds(100, 100, 600, 600);
- add(new PPanel());
- setVisible(true);
- }
- public static void main(String[] args) {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- new PFrame();
- }
- });
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д