您的位置:首页 > 编程语言 > Java开发

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

2018-01-10 12:05 1071 查看

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

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 拖拽图片 swing