首页 > 解决方案 > 将 JLabel 拖放到另一个 JLabel 的顶部

问题描述

我有两个图像作为 JLabels 的 JPanel。我正在尝试拖动右侧图像并将其放在左侧图像的顶部,释放鼠标后它应该保留在那里。目前我可以拖动图像,但它位于放置位置图像下方。第二个问题是当我在图像上按下鼠标时,该位置与实际图像边界不同。如何获得相对于主面板的确切位置?

这是我的编码。

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);
            }
        }
    }

要拖动图像的位置。

以后应该怎么样。。

标签: javaswingdrag-and-dropjpaneljlabel

解决方案


我有两个图像作为 JLabels 的 JPanel

在我看来,您有一个包含 2 个面板的面板。这些面板中的每一个都包含一个标签。为什么要将每个标签添加到第二个面板?

摆脱“包装”面板,只需将标签直接添加到主面板。

我正在尝试拖动右侧图像并将其放在左侧图像的顶部,释放鼠标后它应该保留在那里

Swing 基于Z Order. 当一个组件被添加到面板时,ZOrder 会增加,并且首先绘制具有最高 ZOrder 的组件,所以基本上最后添加到面板的组件首先被绘制。

因此,在您的情况下,右标签涂在左标签之前。

如果要拖动右标签使其在左标签之后绘制,则在 mousePressed 代码中,您可以使用更改组件的 ZOrder

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

现在,当您将组件拖到面板上时,组件将被最后绘制。


推荐阅读