JAVA中如何实现用鼠标拖动自由移动Jpanel面板位置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源代码如下:
package iframe;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.Box;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.MouseInputListener;
import home.Target;
import iframe.BackgroundPanel;
import publicclass.jinternalFrame;

public class Floor {
Image img;
int x0;//地图原点X方向偏移量
int y0;//地图原点y方向偏移量
int imgWidth, imgHeight;
int countnum=50;
int width;//面板宽度
int height;//面板高度
BackgroundPanel backgroundPanel;//背景面板
Target target=new Target();
AnchorManage anchormanage=new AnchorManage();
String floorTitle;//层名称
MapManage map=new MapManage();
/*获取图层的名称/
public String getFloorTitle() {
return floorTitle;
}

/**设置图层的名称*/
public void setFloorTitle(String floorTitle) {
	this.floorTitle = floorTitle;
}

public JInternalFrame getFloor(String title,String floor) {//第一参数表示面板名称,第二个参数表示图层
	jinternalFrame jinerFrame=new jinternalFrame();//实例化一个内部内窗体对象		
	JInternalFrame jinFrame=jinerFrame.creatTagInDest(title,"image/icon/tagicon.png");
	String mapAdress=map.getMapAdress(floor);
	x0=map.getx_x0(floor);//地图原点X方向偏移量
	y0=map.gety_y0(floor);//地图原点Y方向偏移量
	anchormanage.setX0(x0);//设置基站的X方向偏移量
	anchormanage.setY0(y0);//设置基站的Y方向偏移量
	target.setX0(x0);//设置标签的X方向偏移量
	target.setX0(y0);//设置标签的Y方向偏移量
	backgroundPanel = new BackgroundPanel(mapAdress,x0,y0);// 创建带背景的面板
	JLabel[] tagLabel=target.targetJlabel(floor);//背景面板添加图标
	for(int i=0;i<tagLabel.length;i++) {
		backgroundPanel.add(tagLabel[i]);
	}

	JLabel[] anchorLabel=anchormanage.getAnchorJlabel(floor);//背景面板添加基站图标
	for(int i=0;i<anchorLabel.length;i++) {
		backgroundPanel.add(anchorLabel[i]);
	}
	target.statThread();
	anchormanage.startThread();

	jinFrame.add(getFloorJpan());  
	return jinFrame;

}



public JPanel getFloorJpan() {//创建层面板
	JPanel floorJpan=new JPanel();
	floorJpan.setBackground(Color.black);//设置面板背景颜色
	floorJpan.setLayout(new BorderLayout());//设置面板为边界布局	
	Box topicBox = Box.createHorizontalBox();// 创建一个水平箱容器	
	topicBox.setBackground(Color.WHITE);
	JLabel tagCount=new JLabel("在线标签数统计:");
	JLabel tagCount2=new JLabel("测试");
	topicBox.add(tagCount);
	topicBox.add(Box.createHorizontalStrut(35));// 添加一个5像素宽的水平支柱
	topicBox.add(tagCount2);
	floorJpan.add(topicBox,BorderLayout.NORTH);
	floorJpan.add(backgroundPanel, BorderLayout.CENTER);//将带背景的面板添加到层面板中	

	/*--------------------鼠标滚动事件监听开始----------------------------------*/
	backgroundPanel.addMouseWheelListener(new MouseWheelListener() {			
		public void mouseWheelMoved(MouseWheelEvent e) {

			//e.getWheelRotation()>0表示鼠标滚轮向外滚动小于0表示向内滚动

			if(e.getWheelRotation()>0 && countnum <= 200) {
				countnum=countnum+10;
				backgroundPanel.setNum(countnum);	


			}
			if(e.getWheelRotation()<0 && countnum >= 20) {
				countnum=countnum-10;
				backgroundPanel.setNum(countnum);
			}
			backgroundPanel.repaint();
		}
	});

/--------------------鼠标滚动事件监听结束----------------------------------/

    MouseEventListener mouseListener = new MouseEventListener(backgroundPanel);
    backgroundPanel.addMouseListener(mouseListener);
    backgroundPanel.addMouseMotionListener(mouseListener);


	return floorJpan;

}

 /**鼠标事件监听*/
class MouseEventListener implements MouseInputListener {
	
	Point origin;//点
	BackgroundPanel backgroundPanel;//需要自由拖动的带背景图片的面板
	
	public MouseEventListener(BackgroundPanel backgroundPanel) {
        this.backgroundPanel = backgroundPanel;
        origin = new Point();
    }
	
	public void mouseClicked(MouseEvent e) {
		// TODO 自动生成的方法存根

	}

	@Override
	public void mousePressed(MouseEvent e) {
		//鼠标点击面板变为手形
		backgroundPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));	
		 origin.x = e.getX();  
         origin.y = e.getY();

	}

	@Override
	public void mouseReleased(MouseEvent e) {
		//鼠标离开面板变为手形
		backgroundPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		//鼠标进入面板变为手形
		backgroundPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO 自动生成的方法存根

	}

	@Override
	public void mouseDragged(MouseEvent e) {
		backgroundPanel.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
		Point p = this.backgroundPanel.getLocation();
        this.backgroundPanel.setLocation(//面板新的坐标位置  = 移动前坐标位置+(鼠标指针当前坐标-鼠标按下时指针的位置)
            p.x + (e.getX() - origin.x), 
            p.y + (e.getY() - origin.y)); 

	}

	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO 自动生成的方法存根

	}}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值