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