绘制的线条连接在一起而不是独立

时间:2011-05-18 08:50:53

标签: java swing

我正在实现一个扩展JPanel的类,并且这个类被添加到JTabPane中,你可以像绘制程序一样在区域上绘制东西,但是当绘制一个新行时它将与之前的绘图点连接,为什么会这样? 并且在for循环中,arrayList的大小为-2,我可能知道为什么需要它?我试过删除它,它会导致错误。 enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class STDrawingArea extends JPanel{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    ArrayList<Point> Points = new ArrayList<Point>();

    public STDrawingArea()
    {

        setBorder(BorderFactory.createLineBorder(Color.black));
        setBackground(Color.WHITE);
        addMouseMotionListener(new MouseAdapter() {
           public void mouseDragged(MouseEvent e) {
                Points.add(e.getPoint());
                System.out.println("Dragged");
                repaint();

                }

            });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(700,600);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        for(int i = 0 ; i < Points.size()-2;i++)
        {
            Point p1 = Points.get(i);
            Point p2 = Points.get(i+1);
            g.drawLine(p1.x, p1.y, p2.x, p2.y);

        }

    }

    public void clearDrawings()
    {
        Points.clear();
        repaint();
    }
}

1 个答案:

答案 0 :(得分:1)

是的,列表大小检查中有-2,但我认为你必须增加2个单位:

i += 2;

达到你想要的效果。 试试这个:

for(int i = 0 ; i < Points.size()-2;i+=2)
        {
            Point p1 = Points.get(i);
            Point p2 = Points.get(i+1);
            g.drawLine(p1.x, p1.y, p2.x, p2.y);

        }

编辑:

看着你的照片似乎没有连线。我看到你的线条之间有空白。 可能mouseDragged不是正确的使用方法。它抛出了很多MouseEvent事件,使你的代码绘制了许多断开的行,一行接近其他行。 尝试使用MousePressed或MouseClicked方法做同样的事情。我想你会看到你现在的代码是正确的。

提示: 在Java约定中,字段和变量应以小写的首字母开头,因此以这种方式更改Points声明:

ArrayList<Point> points = new ArrayList<Point>();