Рисование на JavaFX Canvas
Создал что-то по типу Paint'a на Canvas но столкнулся с проблемой - если слишком быстро вести курсор, то фигуры рисуются отрывчато:
Можно ли это исправить, чтобы линия была без пробелов, как в Paint'e? Реализация рисования:
canvas.setOnMousePressed(mouseEvent -> {//логика рисования
gc.setFill(cp.getValue());//определям цвет
if(brushType.equals("Square")) {
gc.fillRect(mouseEvent.getX()-brushSize, mouseEvent.getY()-brushSize, brushSize, brushSize);//рисуем
canvas.setOnMouseDragged(mouseEvent1 -> gc.fillRect(mouseEvent1.getX()-brushSize, mouseEvent1.getY()-brushSize, brushSize, brushSize));//рисуем, если курсор двинулся
}
else if(brushType.equals("Circle")){
gc.fillOval(mouseEvent.getX()-brushSize, mouseEvent.getY()-brushSize, brushSize, brushSize);//рисуем
canvas.setOnMouseDragged(mouseEvent1 -> gc.fillOval(mouseEvent1.getX()-brushSize, mouseEvent1.getY()-brushSize, brushSize, brushSize));//рисуем, если курсор двинулся
}
});
Ответы (1 шт):
Автор решения: dikiy_opezdal
→ Ссылка
Помогло добавление отдельного кода, в котором при движении мыши рисуется линия от прошлого положения курсора к следующему:
canvas.setOnMouseDragged(mouseEvent1 -> {
gc.lineTo(mouseEvent1.getX(), mouseEvent1.getY());
gc.stroke();
gc.moveTo(MouseDragEvent.getX(), MouseDragEvent.getY());
});//рисуем, если курсор двинулся
Вот как реализовал в програме:
canvas.setOnMousePressed(mouseEvent -> {//логика рисования
gc.setFill(cp.getValue());//определям цвет
gc.setStroke(cp.getValue());
gc.setLineWidth(brushSize);//определяем размер
if(brushType.equals("Square")) {
gc.fillRect(mouseEvent.getX()-brushSize, mouseEvent.getY()-brushSize, brushSize, brushSize);//рисуем
}
else if(brushType.equals("Circle")){
gc.fillOval(mouseEvent.getX()-brushSize, mouseEvent.getY()-brushSize, brushSize, brushSize);//рисуем
}
else if(brushType.equals("Pencil")) {
canvas.setOnMouseDragged(mouseEvent1 -> {
gc.lineTo(mouseEvent1.getX(), mouseEvent1.getY());
gc.stroke();
});//рисуем, если курсор двинулся
}
gc.moveTo(mouseEvent.getX(), mouseEvent.getY());//обновляем положение курсора, чтобы при следующем нажатии мыши не было лишней линии
});
