#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. Если бы я понял, что вы пытаетесь сделать.