Перетащите JLabel поверх другой JLabel - PullRequest
0 голосов
/ 29 июня 2018

У меня есть JPanel с двумя изображениями как JLabels. Я пытаюсь перетащить изображение с правой стороны и поместить его поверх изображения с левой стороны, и оно должно оставаться там после отпускания мыши. В настоящее время я могу перетащить изображение, но оно идет под изображением местоположения сброса. Вторая проблема - когда я нажимаю мышь на изображение, это местоположение отличается от фактических границ изображения. Как я могу получить точное местоположение относительно главной панели?

Вот мое кодирование.

public class loadLayout extends JPanel{

        @Override
        public boolean isOptimizedDrawingEnabled() {
            return false;
        }

        public loadLayout(){

            setLayout(new GridLayout(0, 2));
            setPreferredSize(new Dimension(600, 400));
            setMaximumSize(new Dimension(600, 400));
            setMinimumSize(new Dimension(600, 400));


            try {

                BufferedImage img = ImageIO.read(new File("test.jpg"));
                JPanel leftP = new JPanel(null);
                JLabel leftL = new JLabel(new ImageIcon(img));
                leftL.setSize(img.getWidth(), img.getHeight());
                leftL.setLocation(10, 10);
                leftP.add(leftL);

                JPanel rightP = new JPanel();
                BufferedImage img2 = ImageIO.read(new File("dragger.png"));
                JLabel rightL = new JLabel(new ImageIcon(img2));
                rightL.setSize(img2.getWidth(), img2.getHeight());

                rightP.add(rightL);

                add(leftP);
                add(rightP);

                MouseAdapter mouseHandler = new MouseAdapter() {
                    private Point delta;

                    @Override
                    public void mousePressed(MouseEvent e) {

                        imagePoint = SwingUtilities.convertPoint(rightL, rightL.getX(), rightL.getY(), loadLayout.this);
                        Point origin = e.getPoint();

                        Rectangle bounds = new Rectangle(imagePoint, new Dimension(rightL.getWidth(), rightL.getHeight()));
                        if (bounds.contains(origin)) {
                            delta = new Point(origin.x - imagePoint.x, origin.y - imagePoint.y);
                        }
                    }

                    @Override
                    public void mouseDragged(MouseEvent e) {
                        if (delta != null) {
                            imagePoint = e.getPoint();
                            imagePoint.translate(-delta.x, -delta.y);
                            rightL.setLocation(imagePoint);
                        }
                    }

                    @Override
                    public void mouseReleased(MouseEvent e) {

                        if(delta != null){
                            rightL.setLocation(delta);
                            revalidate();
                            repaint();
                        }

                        delta = null;                        
                    }
                };

                addMouseListener(mouseHandler);
                addMouseMotionListener(mouseHandler);


            } catch (IOException ex) {
                Logger.getLogger(DragnDropTest1.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Место для нажатия, чтобы перетащить изображение.

Как и должно быть после ..

1 Ответ

0 голосов
/ 29 июня 2018

У меня есть JPanel с двумя изображениями как JLabels

Похоже, у вас есть панель, которая содержит 2 панели. Каждая из этих панелей содержит ярлык. Почему вы добавляете каждый ярлык на вторую панель?

Избавьтесь от «обёрточных» панелей и просто добавьте метки прямо на главную панель.

Я пытаюсь перетащить изображение с правой стороны и поместить его поверх изображения с левой стороны, и оно должно оставаться там после отпускания мыши

Swing красит компоненты на основе Z Order. При добавлении компонента на панель ZOrder увеличивается, и компонент с самым высоким значением ZOrder окрашивается первым, поэтому в основном последний компонент, добавленный на панель, окрашивается первым.

Так что в вашем случае правая метка закрашена перед левой меткой.

Если вы хотите перетащить правую метку, чтобы она рисовалась ПОСЛЕ левой метки, то в коде мыши, нажатой на кнопку, вы можете изменить ZOrder компонента, используя

JPanel parent = e.getComponent().getParent;
parent.setComponentZOrder(e.getComponent(), 0);

Теперь компонент будет закрашен последним при его перетаскивании на панель.

...