我尝试写一个可以拖拽移动图片的窗口,初步想法是用JLabel放图片,并且注册MouseLister和MouseMotionListener监听,使用setLocation方法来移动图片。具体代码如下
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.lang.invoke.LambdaConversionException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.FlowLayout;
public class TestRemove extends JFrame implements MouseListener,
MouseMotionListener {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestRemove frame = new TestRemove();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public TestRemove() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JButton btnNewButton = new JButton("New button");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
});
contentPane.add(btnNewButton, BorderLayout.SOUTH);
panel = new JPanel();
contentPane.add(panel, BorderLayout.CENTER);
label = new JLabel("");
label.addMouseListener(this);
label.addMouseMotionListener(this);
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
label.setIcon(new ImageIcon("E:\\\u56FE\u7247\\\u56FE\u7247\\k\\k7.png"));
panel.add(label);
}
public void mouseClicked(MouseEvent e) {
}
private int mx = 0, my = 0;
private JLabel label;
private int x,y;
private JPanel panel;
public void mousePressed(MouseEvent e) {
mx = e.getX();
my = e.getY();
}
public void mouseReleased(MouseEvent e) {
// label.setLocation(x, y);
// panel.add(label);
// panel.repaint();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
x=e.getX()+mx;
y=e.getY()+my;
label.setLocation(e.getX()+mx, e.getY()+my);
}
public void mouseMoved(MouseEvent e) {
}
}
但是这个写出来图片会出现闪烁
后来我又想了一个方法,直接将图片绘制到JPanel上,具体代码如下
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class testPanel extends JPanel implements MouseListener,
MouseMotionListener {
int x, y;
ImageIcon ii1 = null;
int mx, my;
public testPanel() {
super();
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
ImageIcon ii = new ImageIcon("E:/图片/图片/k/k3.png");
if (x == 0 || y == 0) {
System.out.println("坐标归位");
}
if (b) {
g.drawImage(ii.getImage(), x, y, ii.getIconWidth(),
ii.getIconHeight(), this);
} else if (x != 0 && y != 0) {
g.drawImage(ii.getImage(), x, y, ii.getIconWidth(),
ii.getIconHeight(), this);
}
b = false;
System.out.println("x==" + x);
System.out.println("y==" + y);
}
public void mouseDragged(MouseEvent e) {
int x1 = e.getX() - mx;
int y1 = e.getY() - my;
x = x1;
y = y1;
// x = e.getX() - mx;
// y = e.getY() - my;
// if (b) {
// System.out.println("位置x----" + x);
// System.out.println("位置y----" + y);
// b = false;
// }
if (x != 0 && y != 0) {
// System.out.println("又归位了");
this.repaint();
}
}
boolean b = true;
public void mousePressed(MouseEvent e) {
mx = e.getX();
my = e.getY();
// System.out.println("按下---x---" + mx);
// System.out.println("按下---y---" + my);
}
// 无用
public void mouseClicked(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
}
}
这个效果基本到达要求,但是也有一个问题,就是第二次移动时,图片会自动往0,0坐标上跑。
我在网上查到如下代码
import java.awt.Color;
import java.awt.Point;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputListener;
public class Test {
JLabel Pic; // 图片,用于拖动
JFrame frame;
JPanel panel;
public Test() {
frame = new JFrame("图片的拖动");
Pic = new JLabel(new ImageIcon("E:/图片/图片/k/k3.png"));
panel = new JPanel();
panel.setBackground(Color.white);
panel.add(Pic);
// 事件
DragPicListener listener = new DragPicListener(); // 鼠标事件处理
Pic.addMouseListener(listener); // 增加标签的鼠标事件处理
Pic.addMouseMotionListener(listener);
frame.add(panel);
frame.setSize(400, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class DragPicListener implements MouseInputListener {
Point point = new Point(0, 0); // 坐标点
public void mousePressed(MouseEvent e) {
point = SwingUtilities.convertPoint(Pic, e.getPoint(),
Pic.getParent()); // 得到当前坐标点
}
public void mouseDragged(MouseEvent e) {
Point newPoint = SwingUtilities.convertPoint(Pic, e.getPoint(),
Pic.getParent()); // 转换坐标系统
Pic.setLocation(Pic.getX() + (newPoint.x - point.x), Pic.getY()
+ (newPoint.y - point.y)); // 设置标签图片的新位置
point = newPoint; // 更改坐标点
System.out.println(Pic.getX());
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
}
}
public static void main(String[] args) {
new Test();
}
}