如何在 Java GUI 中使用鼠标光标拖动图像?

Mar*_*Vin 3 java user-interface image drag imageicon

// 我的代码调用要放置在 JPanel 上的目录中的 n 个图像

 public void imageAdder(int n, String name){
    BufferedImage myPic = null;
    for (int i = 0; i <= n; i++){
        try {
        myPic = ImageIO.read(new File("Images/" + name + i + ".jpg"));
        } catch (Exception e){
        System.out.println("no file man cmon");
        }
        JLabel picLabel = new JLabel(new ImageIcon(myPic));
      //  picLabel.setBounds(mouseX, mouseY, 100, 50);
      //  picLabel.addMouseMotionListener(this);
      //  picLabel.addMouseListener(this);
        canvas.add(picLabel);
    }}
Run Code Online (Sandbox Code Playgroud)

我阅读了类 DragSource 以及如何有一种方法可以拖动图像类型的东西,但我不确定这是否适用于我的代码。如果我想用鼠标自由拖动图像怎么办?

Mad*_*mer 6

有多种方法可以实现这一点……例如,您可以使用自定义绘画来自己绘制单个图像。每次按下/拖动鼠标时,您都需要计算拖动了哪个图像。

一个稍微简单的解决方案可能是使用 aJLayeredPane并继续使用JLabels 来渲染图像,然后您可以使用 a MouseListenerandMouseMoitionListener检测何时按下和/或拖动标签并相应地更新它的位置......

有关更多详细信息,请参阅如何编写鼠标侦听器如何使用分层窗格

拖

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestDrag {

    public static void main(String[] args) {
        new TestDrag();
    }

    public TestDrag() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JLayeredPane {

        public TestPane() {
            File[] images = new File("C:\\hold\\thumbnails").listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    String name = pathname.getName().toLowerCase();
                    return name.endsWith(".png") || 
                                    name.endsWith(".jpg") || 
                                    name.endsWith(".bmp") ||
                                    name.endsWith(".gif");
                }
            });

            int x = 0;
            int y = 0;
            for (File imgFile : images) {

                try {
                    BufferedImage img = ImageIO.read(imgFile);
                    JLabel label = new JLabel(new ImageIcon(img));
                    label.setSize(label.getPreferredSize());
                    label.setLocation(x, y);
                    MouseHandler mh  = new MouseHandler();
                    label.addMouseListener(mh);
                    label.addMouseMotionListener(mh);
                    add(label);
                    x += 20;
                    y += 20;
                } catch (IOException exp) {
                    exp.printStackTrace();
                }

            }

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(800, 800);
        }

        public class MouseHandler extends MouseAdapter {

            private Point offset;

            @Override
            public void mousePressed(MouseEvent e) {
                JLabel label = (JLabel) e.getComponent();
                moveToFront(label);
                offset = e.getPoint();
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                int x = e.getPoint().x - offset.x;
                int y = e.getPoint().y - offset.y;
                Component component = e.getComponent();
                Point location = component.getLocation();
                location.x += x;
                location.y += y;
                component.setLocation(location);
            }

        }

    }

}
Run Code Online (Sandbox Code Playgroud)