swing实现鼠标框选

记录鼠标按下位置和拖动位置,然后画矩形框,很简单的逻辑,不解释了,直接上代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RectPanel extends JPanel implements MouseListener,
		MouseMotionListener {
	Point pStart = null;
	Point pEnd = null;
JToggleButton btn=new JToggleButton("button");
	public RectPanel() {
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		btn.setLocation(20, 20);
		this.add(btn);
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		if (pStart != null && pEnd != null) {
			g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT,
					BasicStroke.JOIN_BEVEL, 0, new float[] { 5, 5 }, 0));

			int x = Math.min(pStart.x, pEnd.x);
			int y = Math.min(pStart.y, pEnd.y);
			int width= Math.abs(pStart.x - pEnd.x);
			int height=Math.abs(pStart.y - pEnd.y);
			g2d.drawRect(x, y,width,height);
			 g2d.setColor(new Color(125, 125, 125, 40));
			 g2d.fillRect(pEnd.x, pEnd.y, pStart.x - pEnd.x, pStart.y -
			 pEnd.y);
		}
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				JFrame frame = new JFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setSize(400, 400);
				frame.setContentPane(new RectPanel());
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}

	@Override
	public void mouseClicked(MouseEvent e) {

	}

	@Override
	public void mousePressed(MouseEvent e) {
		pStart = e.getPoint();
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		Rectangle r=new Rectangle(Math.min(pStart.x, pEnd.x),Math.min(pStart.y, pEnd.y), Math.abs(pStart.x - pEnd.x),
				Math.abs(pStart.y - pEnd.y));
		if(r.contains(btn.getBounds())){
			btn.setSelected(!btn.isSelected());
		}
		pStart = null;
		pEnd = null;
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		pEnd = e.getPoint();
		repaint();
	}

	@Override
	public void mouseMoved(MouseEvent e) {
	}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值