Java 摆动-避免在不同管路之间填充管路

Java 摆动-避免在不同管路之间填充管路,java,swing,graphics,line,mouselistener,Java,Swing,Graphics,Line,Mouselistener,我试图通过用Java开发一个简单的绘图应用程序进入Swing 问题是我正在使用一组点来跟踪mouseDragged事件,但是当我释放鼠标按钮并开始绘制一条新线时,它们会连接起来(上一条线的最后一个节点到新线的第一个点) 我在想,也许可以跟踪另一个ArrayList中的鼠标按下的和鼠标松开的监听器听到的点,知道每一行的起点和终点,然后,在点之间画线的时候,检查它们是否在ArrayList中,并避免绘制该行 你建议的方法是什么?如何在代码中实现这一点?谢谢大家! package ccdraw; i

我试图通过用Java开发一个简单的绘图应用程序进入Swing

问题是我正在使用一组
点来跟踪
mouseDragged
事件,但是当我释放鼠标按钮并开始绘制一条新线时,它们会连接起来(上一条线的最后一个节点到新线的第一个点)

我在想,也许可以跟踪另一个
ArrayList
中的
鼠标按下的
鼠标松开的
监听器听到的
,知道每一行的起点和终点,然后,在点之间画线的时候,检查它们是否在
ArrayList
中,并避免绘制该行

你建议的方法是什么?如何在代码中实现这一点?谢谢大家!

package ccdraw;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.event.MouseInputListener;

@SuppressWarnings("serial")
public class DrawingArea extends JPanel implements MouseInputListener {

    private ArrayList<Point> pointList = new ArrayList<Point>();
    //private ArrayList<Point> beginEndPoints = new ArrayList<Point>();

    public DrawingArea() {
        super();
        super.setPreferredSize(new Dimension(400,400));
        setBorder(BorderFactory.createLineBorder(Color.black));

        addMouseListener(this);
        addMouseMotionListener(this);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        doDrawing(g);
    }

    private void doDrawing(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.setStroke(new BasicStroke(1.5f));

        for (int i=1;i<pointList.size()-1;i++){
            // here i should check when it changes between old and new line
            // and don't draw the line between those two points!
            //if(pointList.get(i).x - pointList.get(i+1).x <= 1 &&     pointList.get(i).y - pointList.get(i+1).y <= 1)
            g2d.drawLine(pointList.get(i).x, pointList.get(i).y,     pointList.get(i+1).x, pointList.get(i+1).y);
        }
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
}

@Override
public void mousePressed(MouseEvent arg0) {
    pointList.add(arg0.getPoint());

}

@Override
public void mouseReleased(  MouseEvent arg0) {
    pointList.add(arg0.getPoint());
    repaint();
}

@Override
public void mouseDragged(MouseEvent arg0) {
    pointList.add(arg0.getPoint());
    repaint();
}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseMoved(MouseEvent e) {
    // TODO Auto-generated method stub

}
}
包ccdraw;
导入java.awt.BasicStroke;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.event.MouseEvent;
导入java.util.ArrayList;
导入javax.swing.BorderFactory;
导入javax.swing.JPanel;
导入javax.swing.event.MouseInputListener;
@抑制警告(“串行”)
公共类DrawingArea扩展JPanel实现MouseInputListener{
private ArrayList pointList=new ArrayList();
//私有ArrayList beginEndPoints=新ArrayList();
公共提款区(){
超级();
super.setPreferredSize(新尺寸(400400));
setboorder(BorderFactory.createLineBorder(Color.black));
addMouseListener(这个);
addMouseMotionListener(此);
}
公共组件(图形g){
超级组件(g);
doDrawing(g);
}
私人空间绘制(图g){
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.RED);
g2d.设定行程(新基本行程(1.5f));
对于(int i=1;i
我在想,也许可以在另一个arraylist中记录鼠标按下和鼠标按下的听众所听到的要点

保存一个ArrayList的ArrayList

因此,每次执行mousePressed操作时,都会为MouseDraged事件要添加的一系列点启动一个新的ArrayList

然后在绘制代码中迭代两个ArrayList。这应该比为起点/终点添加异常逻辑更容易

另一种选择是直接对BuffereImage进行绘制,因此您根本不需要跟踪点。请查看这两种常规自定义绘制方法的比较,以确定哪种方法最适合您的要求。

使用ArrayList是我的选择,我创建了另一个Line类,该类使用ArrayList。