java 窗体鼠标拖动图片,如何在Java GUI中使用鼠标光标拖动图像?

// 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;

for (int i = 0; i <= n; i++){

try {

myPic = ImageIO.read(new File("Images/" + name + i + ".jpg"));

} catch (Exception e){

System.out.println("no file man cmon");

}

JLabel picLabel = new JLabel(new ImageIcon(myPic));

// picLabel.setBounds(mouseX, mouseY, 100, 50);

// picLabel.addMouseMotionListener(this);

// picLabel.addMouseListener(this);

canvas.add(picLabel);

}}

I read about the class DragSource and how there's a method that drags things of type image, but I'm not sure if that's applicable given my code. What should I do if I wanted to freely drag the images with my mouse?

解决方案

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...

mmsFU.gif

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

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值