Перемещение компонентов и некорректное их отображение - 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();
            }
        });
    }
}

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


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

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

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