【问题标题】:Drag and Drop JLabel in top of another JLabel将 JLabel 拖放到另一个 JLabel 的顶部
【发布时间】:2018-06-29 13:37:46
【问题描述】:

我有两个图像作为 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);
            }
        }
    }

Location to press to drag the image.

How it should be after..

【问题讨论】:

  • 我的问题是当我点击图片时,它的位置与实际位置不同。我想得到确切的位置。
  • 好东西!现在这使我的 cmets 噪音(已删除)和密切投票无关(撤回)。一切顺利。 :)

标签: java swing drag-and-drop jpanel jlabel


【解决方案1】:

我有两个图像作为 JLabels 的 JPanel

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

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

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

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

所以在你的情况下,右标签画在左标签之前。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多