java矩形移动_java 拖拽矩形

本文介绍了一个Java程序,该程序允许用户在组件上通过鼠标点击和拖动来创建和移动矩形。代码包括两个内部类,分别处理鼠标点击和拖动事件,实现了矩形的增删及拖动功能。程序使用了Graphics2D进行绘图,并调整了鼠标光标样式以提供更好的用户体验。
摘要由CSDN通过智能技术生成

简介

java 拖拽矩形

code

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;

public class MouseComponent extends JComponent {

private static final int DEFAULT_WIDTH = 300;

private static final int DEFAULT_HEIGHT = 200;

private static final int SIDELENGTH = 10;

private ArrayList squares;

private Rectangle2D current;

public MouseComponent() {

squares = new ArrayList<>();

current = null;

addMouseListener(new MouseHandler());

addMouseMotionListener(new MouseMotionHandler());

}

public Dimension getPreferredSize() {

return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);

}

public void paintComponent(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

// draw all squares

for (Rectangle2D r : squares) {

g2.draw(r);

}

}

public Rectangle2D find(Point2D p) {

for (Rectangle2D r : squares) {

if (r.contains(p))

return r;

}

return null;

}

public void add(Point2D p) {

double x = p.getX();

double y = p.getY();

current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);

squares.add(current);

repaint();

}

public void remove(Rectangle2D s) {

if (s == null)

return;

if (s == current)

current = null;

squares.remove(s);

repaint();

}

private class MouseHandler extends MouseAdapter {

public void mousePressed(MouseEvent event) {

// add a new square if the cursor isn't inside a square

current = find(event.getPoint());

if (current == null)

add(event.getPoint());

}

public void mouseClicked(MouseEvent event) {

// remove the current square if double clicked

current = find(event.getPoint());

if (current != null && event.getClickCount() >= 2)

remove(current);

}

}

private class MouseMotionHandler implements MouseMotionListener {

public void mouseMoved(MouseEvent event) {

// set the mouse cursor to cross hairs if it is inside

// a rectangle

if (find(event.getPoint()) == null)

setCursor(Cursor.getDefaultCursor());

else

setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

}

public void mouseDragged(MouseEvent event) {

if (current != null) {

int x = event.getX();

int y = event.getY();

// drag the current rectangle to center it at(x,y)

current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);

repaint();

}

}

}

}

import java.awt.*;

import javax.swing.*;

public class MouseFrame extends JFrame{

public static void main(String[] args) {

EventQueue.invokeLater(() -> {

MouseFrame m = new MouseFrame();

m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

m.setVisible(true);

});

}

public MouseFrame() {

add(new MouseComponent());

pack();

}

}

image

ce2fa89eac187a26c8999e005c482274.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值