Java 小例子:创建一个可拖拽图片的面板

今天在论坛上看到帖子希望能在 Swing 中实现像拖地图一样拖拽图片。这里是一个最简单的实现,提供了一个基本思路。

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;

/**
 * 在窗体上拖拽图片。使用方法:双击窗体空白处将会弹出打开图片对话框。打开图片后可以在窗体上拖拽图片。
 */
public class DraggingFrame extends JFrame {
    /**
     * 构造函数
     */
    public DraggingFrame() throws HeadlessException {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(new ImagePanel(), BorderLayout.CENTER);
    } // 程序入口

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        DraggingFrame frame = new DraggingFrame();
        frame.setSize(400, 300);
        frame.setLocation(300, 300);
        frame.setResizable(false);
        frame.setTitle("双击打开图片,然后拖拽");
        frame.setVisible(true);
    }
}

/**
 * 能够拖拽图片的面板
 */
class ImagePanel extends JPanel {
    private DragStatus status = DragStatus.Ready;   // 拖拽状态
    private Image image;                            // 要显示的图片
    private Point
            imagePosition = new Point(0, 0),        // 图片的当前位置
            imageStartPosition = new Point(0, 0),   // 每次拖拽开始时图片的位置(也就是上次拖拽后的位置)
            mouseStartPosition;                     // 每次拖拽开始时鼠标的位置

    ImagePanel() {
        addMouseListener(new MouseListener() {
            // 双击鼠标时打开图片
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    openImage();
                }
            }

            // 按下鼠标时,更改状态,并且记录拖拽起始位置。
            public void mousePressed(MouseEvent e) {
                if (status == DragStatus.Ready) {
                    status = DragStatus.Dragging;
                    mouseStartPosition = e.getPoint();
                    imageStartPosition.setLocation(imagePosition.getLocation());
                }
            }

            // 松开鼠标时更改状态
            public void mouseReleased(MouseEvent e) {
                if (status == DragStatus.Dragging) {
                    status = DragStatus.Ready;
                }
            }

            public void mouseEntered(MouseEvent e) {
            }

            public void mouseExited(MouseEvent e) {
            }
        });
        addMouseMotionListener(new MouseMotionListener() {
            // Java 有拖拽事件,在这个事件中移动图片位置
            public void mouseDragged(MouseEvent e) {
                if (status == DragStatus.Dragging) {
                    moveImage(e.getPoint());
                }
            }

            public void mouseMoved(MouseEvent e) {
            }
        });
    }

    /**
     * 移动图片。实际上画图工作在 paintComponent() 中进行,这里只是计算图片位置,然后调用该方法。
     *
     * @param point 当前的鼠标位置
     */
    private void moveImage(Point point) {
        // 图片的当前位置等于图片的起始位置加上鼠标位置的偏移量。
        imagePosition.setLocation(
                imageStartPosition.getX() + (point.getX() - mouseStartPosition.getX()),
                imageStartPosition.getY() + (point.getY() - mouseStartPosition.getY())
        );
        repaint();
    }

    // 打开图片
    private void openImage() {
        System.out.println("Opening image...");
        File file = createFileChooser().getSelectedFile();
        if (file != null) {
            image = Toolkit.getDefaultToolkit().getImage(file.getAbsolutePath());
            if (image != null) {
                this.repaint();
            }
        }
    }

    // 创建打开文件对话框
    private JFileChooser createFileChooser() {
        JFileChooser chooser = new JFileChooser();
        chooser.setDialogTitle("请选择图片文件...");
        chooser.addChoosableFileFilter(new FileNameExtensionFilter("常用图片格式", "jpg", "jpeg", "gif", "png"));
        chooser.showOpenDialog(this);
        return chooser;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image != null) {
            g.drawImage(image, (int) imagePosition.getX(), (int) imagePosition.getY(), this);
        }
    }

    private enum DragStatus {Ready, Dragging}
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值