怎么让矩形顺着我画的线溜下来,鼠标按下,拖动画线,松开鼠标后,产生一矩形,顺着线段跑一圈,以下为我的代码,但是有点问题,看不到跑的过程,只是在线的末尾添加了一矩形.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.SwingUtilities;
class MouseLinePanel extends JPanel {
private List<Line2D> lineList; // 线集合
private Point2D lastPoint; // 保存最后点
private Rectangle2D rec; // 矩形
private static final int LENGTH = 10;// 矩形长宽
private List<Point2D> pointList; //所有线段的起始点集合
public MouseLinePanel() {
setLayout(null);
lineList = new ArrayList<Line2D>();
pointList = new ArrayList<Point2D>();
MouseLineEvent mle = new MouseLineEvent();
addMouseListener(mle);
addMouseMotionListener(mle);
addMouseWheelListener(mle);
rec = new Rectangle2D.Double();
}
// 重绘线条
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (Line2D line : lineList) {
g2.draw(line);
}
g2.draw(rec);
}
// 监听器
private class MouseLineEvent extends MouseAdapter {
// 按下时调用
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
lastPoint = e.getPoint();// 保存按下的点
}
// 松开时调用
@Override
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
// 取集合中所有线段的起始点
for (Line2D line : lineList) {
pointList.add(line.getP1());
pointList.add(line.getP2());
}
for (Point2D p : pointList) {
//重新设置矩形的加载点
rec.setFrame( p.getX(), p.getY(), LENGTH, LENGTH);
repaint();//刷新面板
}
}
// 拖动
@Override
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
Point2D newPoint = e.getPoint(); // 创建点
Line2D line = new Line2D.Double(lastPoint, newPoint); // 创建线段
lineList.add(line);
lastPoint = newPoint;
repaint();
}
}
}
class MouseLineFrame extends JFrame {
public MouseLineFrame() {
add(new MouseLinePanel());
setSize(700,500);
setVisible(true);
}
}
public class MouseLineTest {
public static void main(String[] args) {
new MouseLineFrame();
}
}
附件是源码
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.SwingUtilities;
class MouseLinePanel extends JPanel {
private List<Line2D> lineList; // 线集合
private Point2D lastPoint; // 保存最后点
private Rectangle2D rec; // 矩形
private static final int LENGTH = 10;// 矩形长宽
private List<Point2D> pointList; //所有线段的起始点集合
public MouseLinePanel() {
setLayout(null);
lineList = new ArrayList<Line2D>();
pointList = new ArrayList<Point2D>();
MouseLineEvent mle = new MouseLineEvent();
addMouseListener(mle);
addMouseMotionListener(mle);
addMouseWheelListener(mle);
rec = new Rectangle2D.Double();
}
// 重绘线条
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (Line2D line : lineList) {
g2.draw(line);
}
g2.draw(rec);
}
// 监听器
private class MouseLineEvent extends MouseAdapter {
// 按下时调用
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
lastPoint = e.getPoint();// 保存按下的点
}
// 松开时调用
@Override
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
// 取集合中所有线段的起始点
for (Line2D line : lineList) {
pointList.add(line.getP1());
pointList.add(line.getP2());
}
for (Point2D p : pointList) {
//重新设置矩形的加载点
rec.setFrame( p.getX(), p.getY(), LENGTH, LENGTH);
repaint();//刷新面板
}
}
// 拖动
@Override
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
Point2D newPoint = e.getPoint(); // 创建点
Line2D line = new Line2D.Double(lastPoint, newPoint); // 创建线段
lineList.add(line);
lastPoint = newPoint;
repaint();
}
}
}
class MouseLineFrame extends JFrame {
public MouseLineFrame() {
add(new MouseLinePanel());
setSize(700,500);
setVisible(true);
}
}
public class MouseLineTest {
public static void main(String[] args) {
new MouseLineFrame();
}
}
附件是源码