【java】实现JPanel鼠标拖拽

本文介绍如何在Java中实现JPanel的鼠标拖拽功能。代码结构清晰,但存在两个问题:未能调整JPanel透明度,以及在mouseDragged事件中Panel位置更新的不连续性,需要通过线程控制。作者指出这一功能仍有改进空间。

话不多说,先上代码:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.event.MouseInputListener;

public class MainFrame extends JFrame {
	final JPanel panel1 = new JPanel();
	final JPanel panel2 = new JPanel();
	final JPanel maskJPanel = new JPanel();

	public MainFrame() {
		this.setSize(900, 600);
		this.setLayout(null);
		this.add(panel1);
		this.add(panel2);
		this.add(maskJPanel);
		panel1.setBounds(0, 0, 100, 100);
		panel2.setBounds(200, 0, 100, 100);
		panel1.setBackground(new Color(0));
		panel2.setBackground(new Color(1));
		ImageIcon bgiIcon = new ImageIcon("mask.png");
		JLabel bg = new JLabel(bgiIcon);
		maskJPanel.add(bg);
		bg.setBounds(0, 0, 100, 100);
		this.setVisible(true);

		Drag drag = new Drag();
		addMouseListener(drag);
		addMouseMotionListener(drag);

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MainFrame mainFrame = new MainFrame();
	}

	class Drag implements MouseInputListener {
		int moving = 0;  //显示Panel是否处于移动过程中,否则只要单击便会调用press里面的方法
		int xinit = 0;	 //鼠标按下时所处的X坐标
		int yinit = 0;   //鼠标按下时所处的Y坐标
		int x0 = 0;		//拖拽过程中鼠标的位置
		int y0 = 0;
		Timer timer;

		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub

		}
		
		//鼠标按下时初始化线程
		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			xinit = e.getX();
			yinit = e.getY();
			timer = new Timer(10, new ActionListener() {

				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					maskJPanel.setBounds(x0 - xinit + panel2.getX(), y0 - yinit
							+ panel2.getY(), 100, 100);
				}
			});
		}
		
		//鼠标松开时结束线程
		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			if (moving == 1) {
				int x1 = e.getX();
				int y1 = e.getY();
				panel2.setBounds(x1 - xinit + panel2.getX(),
						y1 - yinit + panel2.getY(), 100, 100);
				moving = 0;
				panel2.setVisible(true);
				maskJPanel.setVisible(false);
				timer.stop();
			}
		}
		
		//鼠标拖动过程中,不断更新maskPanel的位置
		@Override
		public void mouseDragged(MouseEvent arg0) {
			// TODO Auto-generated method stub
			x0 = arg0.getX();
			y0 = arg0.getY();
			if (x0 > panel2.getX() && x0 < (panel2.getX() + panel2.getWidth())
					&& y0 > panel2.getY()
					&& y0 < (panel2.getY() + panel2.getHeight())) {
				moving = 1;
				panel2.setVisible(false);
				maskJPanel.setVisible(true);
				timer.start();
			}

		}

		@Override
		public void mouseMoved(MouseEvent arg0) {
			// TODO Auto-generated method stub

		}

	}

}

首先因为只是一个Demo。所以比较粗糙~

个人认为代码结构还是比较清晰的,其中存在几个小问题:

1. 不大会调节JPanel 的透明度,所以只能自己p了一张图作为拖拽图中显示的Panel

2. 在mouseDragged中,似乎是可以持续监听的,因为加入输出语句后会显示多行坐标数据,但是显示出来的Panel确实直接跳到了一个位置并且不能继续移动,所以才加了个线程控制Panel的位置。。。。。。还是值得继续研究下去



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值