java未解惑

我尝试写一个可以拖拽移动图片的窗口,初步想法是用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();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值