нарисованные линии соединяются вместе, а не сами по себе - PullRequest
0 голосов
/ 18 мая 2011

Я реализую класс с расширением JPanel, и этот класс добавляется в JTabPane, и вы можете рисовать объекты в области, такие как программа Paint, однако при рисовании новой линии она соединится с предыдущими точками рисования, Почему это так? и в цикле for есть размер -2 на arrayList, могу ли я знать, зачем это нужно? Я попытался удалить его, и это вызывает ошибку. 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 Ответ

1 голос
/ 18 мая 2011

Да, в проверке размера списка есть -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);

        }

EDIT:

Глядя на тебя, картинка не кажется, что линии связаны между собой. Я вижу пробелы между вашими строками. Вероятно, mouseDragged - это не правильный метод для использования. Он генерирует множество событий MouseEvent, в результате чего ваш код рисует множество разрозненных линий, одна из которых близка к другим Попробуйте сделать то же самое с помощью метода MousePressed или MouseClicked. Я думаю, вы увидите, что ваш код сейчас правильный.

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

ArrayList<Point> points = new ArrayList<Point>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...