实现JFrame的拉动和拖动

本文介绍了一个使用Java Swing实现自定义无边框窗口(JFrame)的方法,包括如何通过鼠标操作来拖动窗口位置及调整窗口大小。通过监听鼠标事件,实现了窗口的平移和拉伸功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JFrame拖动和拉动的代码

思想:鼠标放上有个焦点 p1,鼠标按下移动后有个焦点p2,p2.x-p1.x就是x轴移动的距离,p2.y-p1.y就是y轴移动的距离

 

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class IJFrame extends JFrame implements MouseMotionListener{

	private static final long serialVersionUID = 1L;
	private JPanel northPanel;
	private int dragEnabled;
	private Point newPoint;
	private Point oldPoint;
	public IJFrame(){
		this.setUndecorated(true);
		init();
		eventHandle();
		showMe();
		this.addMouseMotionListener(this);
	}
	public void init(){
		northPanel = new JPanel();
		northPanel.setPreferredSize(new Dimension(600,40));
		this.add(northPanel,BorderLayout.NORTH);
	}
	//实现JFrame的拖动
	public void eventHandle(){
		northPanel.addMouseMotionListener(new MouseMotionListener(){
			int old_x;
			int old_y;
			public void mouseDragged(MouseEvent e) {
				IJFrame.this.setLocation(IJFrame.this.getLocation().x+e.getX()-old_x, 
						IJFrame.this.getLocation().y+e.getY()-old_y);
			}

			public void mouseMoved(MouseEvent e) {
				old_x = e.getX();
				old_y = e.getY();
			}
			
		});
		
	}
	
	//实现JFrame的拉动
	public void mouseDragged(MouseEvent e) {
		if (dragEnabled == 0) {
			return;
		}
		oldPoint = newPoint;
		newPoint = e.getPoint();
		if (dragEnabled == 2) {
			this.setSize(new Dimension(this.getSize().width + newPoint.x
					- oldPoint.x, this.getSize().height));
		}
		if (dragEnabled == 3) {
			this.setSize(new Dimension(this.getSize().width,
					this.getSize().height + newPoint.y - oldPoint.y));
		}
		if (dragEnabled == 5) {
			this.setSize(new Dimension(this.getSize().width + newPoint.x
					- oldPoint.x, this.getSize().height + newPoint.y
					- oldPoint.y));
		}
	}

	public void mouseMoved(MouseEvent e) {
		Dimension ds = this.getSize();
		// 北:1,东:2,南:3,西:4
		if (ds.height - e.getY() > 0 && ds.height - e.getY() <= 5
				&& ds.width - e.getX() > 0 && ds.width - e.getX() <= 5) {
			this.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));
			dragEnabled = 5;
			newPoint = e.getPoint();
		} else if (ds.width - e.getX() > 0 && ds.width - e.getX() <= 5) {
			this.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
			dragEnabled = 2;
			newPoint = e.getPoint();
		} else if (ds.height - e.getY() > 0 && ds.height - e.getY() <= 5) {
			this.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
			dragEnabled = 3;
			newPoint = e.getPoint();
		} else {
			this.setCursor(Cursor.getDefaultCursor());
			dragEnabled = 0;
		}
	}
	
	public void showMe(){
		this.setVisible(true);
		this.setSize(600,500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new IJFrame();
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值