当前位置: 移动技术网 > IT编程>开发语言>Java > Java实现的可选择及拖拽图片的面板功能【基于swing组件】

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

2019年07月19日  | 移动技术网IT编程  | 我要评论

本文实例讲述了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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网