How can I drag images with the mouse cursor in Java GUI?

前端 未结 2 427
失恋的感觉
失恋的感觉 2021-01-22 03:55

// my code that calls upon n images in a directory to be placed on the JPanel

 public void imageAdder(int n, String name){
    BufferedImage myPic = null;
    fo         


        
2条回答
  •  再見小時候
    2021-01-22 04:46

    There are a number of ways you might achieve this...for example, you could use custom painting to paint the individual images yourself. Each time the mouse is pressed/dragged, you would need to calculate which image was been dragged.

    A slightly simpler solution might be to use a JLayeredPane and continue using JLabels to render the images, you could then use a MouseListener and MouseMoitionListener to detect when a label was pressed and/or dragged and update it's position accordingly...

    See How to Write a Mouse Listener and How to Use Layered Panes for more details.

    Drag

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

提交回复
热议问题