нарисованные линии соединяются вместе, а не сами по себе

#java #swing

#java #swing

Вопрос:

я реализую класс с расширением JPanel, и этот класс добавляется в JTabPane, и вы можете рисовать объекты на этой области, как программа Paint, однако при рисовании новой линии она соединяется с предыдущими точками рисования, почему это так? и в цикле 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();
    }
}
  

Ответ №1:

Да, при проверке размера списка есть значение -2, но я думаю, что вам нужно увеличить i на 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. Я думаю, вы увидите, что ваш код now верен.

совет: в соглашениях Java поля и переменные должны начинаться со строчной первой буквы, поэтому измените свое объявление Points таким образом:

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

Комментарии:

1. для чего нужна проверка, можете ли вы объяснить?

2. @kyrouge: извините за мой плохой английский. Я имел в виду, что вы проверяете i < Points.size () -2, но вам также следует увеличить i на 2 в вашей cicle. Если бы я понял, что вы пытаетесь сделать.