Java实现的可选择及拖拽图片的面板功能【基于swing组件】

 更新时间:2018年01月10日 12:05:21   作者:捏造的信仰  
这篇文章主要介绍了Java实现的可选择及拖拽图片的面板功能,涉及java基于swing组件选择与操作图片元素的相关实现技巧,需要的朋友可以参考下

本文实例讲述了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;
/**
 * 在窗体上拖拽图片。使用方法:双击窗体空白处将会弹出打开图片对话框。打开图片后可以在窗体上拖拽图片。
 */
@SuppressWarnings("serial")
public class DragingFrame extends JFrame {
  /**
   * 构造函数
   *
   * @throws HeadlessException ???
   */
  public DragingFrame() 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());
    DragingFrame frame = new DragingFrame();
    frame.setSize(400, 300);
    frame.setLocation(300, 300);
    frame.setResizable(false);
    frame.setTitle("www.jb51.net 双击打开图片,然后拖拽");
    frame.setVisible(true);
  }
}
/**
 * 能够拖拽图片的面板
 */
@SuppressWarnings("serial")
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
  }
}

运行效果:

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • mybatis-plus 版本不兼容问题的解决

    mybatis-plus 版本不兼容问题的解决

    这篇文章主要介绍了mybatis-plus 版本不兼容问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • MyBatis实现Mysql数据库分库分表操作和总结(推荐)

    MyBatis实现Mysql数据库分库分表操作和总结(推荐)

    这篇文章主要介绍了MyBatis实现Mysql数据库分库分表操作和总结,需要的朋友可以参考下
    2017-08-08
  • 浅析Java中的Caffeine缓存源码

    浅析Java中的Caffeine缓存源码

    这篇文章主要介绍了浅析Java中的Caffeine缓存源码,Caffeine是一个Java开发的高性能缓存库,它提供了一种简单而强大的方式来管理内存中的缓存数据,Caffeine的设计目标是提供快速、高效的缓存访问,同时保持简单易用的API,本文针对其部分源码做出解析,需要的朋友可以参考下
    2023-10-10
  • 梳理总结Java static关键字的方法作用

    梳理总结Java static关键字的方法作用

    这篇文章主要介绍了梳理总结Java static关键字的方法作用, static 关键字可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的
    2022-06-06
  • kotlin之协程的理解与使用详解

    kotlin之协程的理解与使用详解

    这篇文章主要介绍了kotlin之协程的理解与使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • java进制转换工具类实现减少参数长度

    java进制转换工具类实现减少参数长度

    这篇文章主要为大家介绍了java进制转换工具类实现减少参数长度示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring工厂方法创建(实例化)bean实例代码

    Spring工厂方法创建(实例化)bean实例代码

    这篇文章主要介绍了Spring工厂方法创建bean实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java SE实现多人聊天室功能

    Java SE实现多人聊天室功能

    这篇文章主要为大家详细介绍了Java SE实现多人聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Springboot整合GuavaCache缓存过程解析

    Springboot整合GuavaCache缓存过程解析

    这篇文章主要介绍了springboot整合GuavaCache缓存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java poi设置生成的word的图片为上下型环绕以及其位置的实现

    java poi设置生成的word的图片为上下型环绕以及其位置的实现

    这篇文章主要介绍了java poi设置生成的word的图片为上下型环绕以及其位置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论