Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 5
Регистрация: 24.12.2016
Сообщений: 56

Перетащить линию в пределах Canvas

26.03.2017, 17:09. Показов 2169. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно перенести линию мышью в пределах границ холста?
если использовать метод setOnMouseMoved то он перерисовывает нужную линию вслед за движениями мыши, но во время клика мыши не может закрепить в нужном месте, пока мышь двигается линия так и будет двигаться без остановки.
если применить метод setOnMouseDragged, то он перемещает геометрические примитивы созданные как объект, и перемещает за пределы холста, но зато если кнопку мыши отпустить то перемещение останавливается

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
....
....
public class Canv extends Application {
 
private double x;
private double y;
private double xO;
private double yO;
Canvas myCanvas;
GraphicsContext gc;
 
private void Shapes(GraphicsContext gc) {
GL();
gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3); // границы холста
gc.strokeLine(50, 80, 200, 80);
gc.strokeLine(50, 110, 200, 110);
gc.strokeLine(50, 140, 200, 140);  // линия которую требуется перетащить
gc.strokeLine(50+x, 140, 200+x, 140); //
}
public void GL() {
myCanvas.setOnMouseMoved(new EventHandler<MouseEvent>() {   
        public void handle(MouseEvent e) {
x = e.getX() - 40; // 40 левый отступ AnchorPane.setLeftAnchor(myCanvas, 40.0);
y = e.getY();
gc.clearRect(0, 0, myCanvas.getWidth(), myCanvas.getHeight());
gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
Shapes(gc);
        }
    });
}
 
public static void main(String[] args) {
launch(args);
}
public void start(Stage myStage) throws Exception {
myStage.setTitle("Title");
AnchorPane rootPane = new AnchorPane();
Scene myScene = new Scene(rootPane, 700, 400);
myStage.setScene(myScene);
 
// Canvas
myCanvas = new Canvas(500, 360);
gc = myCanvas.getGraphicsContext2D();
gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
Shapes(gc);
Pane p = new Pane(); 
Rectangle rect = new Rectangle(40, 20, 50, 100);
p.getChildren().add(rect);
 
p.setOnMousePressed(new EventHandler<MouseEvent>() { 
public void handle(MouseEvent e) {
xO = rect.getX() - e.getScreenX();
yO = rect.getY() - e.getScreenY(); }
});  
p.setOnMouseDragged(new EventHandler<MouseEvent>() { 
public void handle(MouseEvent e) {
rect.setX(e.getScreenX() + xO); // перемещает прямоугольник за пределы myCanvas
rect.setY(e.getScreenY() + yO);
}
});
 
// привязки холста
AnchorPane.setLeftAnchor(myCanvas, 40.0);
AnchorPane.setTopAnchor(myCanvas, 20.0);
rootPane.getChildren().add(myCanvas);
rootPane.getChildren().add(p);
myStage.show();
}
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2017, 17:09
Ответы с готовыми решениями:

Провести линию canvas по точкам
Подскажите как можно провести canvas линию между созданными блоками div. Пока что получается опросить только первую координату, с которой...

Удалить линию, нарисованную на Canvas
Можно-ли после отрисовки линии через (Form.CanvasLineTo) удалить её?

Нарисовать на Canvas цепную линию
как нарисовать с помощью канваса в билдере цепную линию? ( y=a*ch(x/a) )

2
77 / 77 / 77
Регистрация: 29.01.2017
Сообщений: 167
27.03.2017, 00:38
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.AnchorPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
 
 
public class Exp extends Application {
 
    Canvas myCanvas;
    GraphicsContext gc;
    private double x;
    private double y;
    private double xO;
    private double yO;
    private boolean moved = true;
 
    public static void main(String[] args) {
        launch(args);
    }
 
    private void Shapes(GraphicsContext gc) {
        GL();
        gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3); // границы холста
        gc.strokeLine(50, 80, 200, 80);
        gc.strokeLine(50, 110, 200, 110);
        gc.strokeLine(50, 140, 200, 140);  // линия которую требуется перетащить
        gc.strokeLine(x, 140, x + 150, 140); //
    }
 
    public void GL() {
        myCanvas.setOnMouseMoved(e -> {
            if (moved) {
                x = Math.min(e.getX(), myCanvas.getWidth() - 150); // 40 левый отступ AnchorPane.setLeftAnchor(myCanvas, 40.0);
                y = e.getY();
                gc.clearRect(0, 0, myCanvas.getWidth(), myCanvas.getHeight());
                gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
                Shapes(gc);
            }
        });
        myCanvas.setOnMouseClicked(event -> moved = !moved);
    }
 
    public void start(Stage myStage) throws Exception {
        myStage.setTitle("Title");
        AnchorPane rootPane = new AnchorPane();
        Scene myScene = new Scene(rootPane, 700, 400);
        myStage.setScene(myScene);
 
// Canvas
        myCanvas = new Canvas(500, 360);
        gc = myCanvas.getGraphicsContext2D();
        gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
        Shapes(gc);
        Rectangle rect = new Rectangle(40, 20, 50, 100);
 
        rect.setOnMousePressed(e -> {
            xO = rect.getX() - e.getSceneX();
            yO = rect.getY() - e.getSceneY();
        });
        rect.setOnMouseDragged(e -> {
            double posX = e.getSceneX() + xO;
            double posY = e.getSceneY() + yO;
            if (posX < 40) posX = 40;
            else if (posX + rect.getWidth() > 40 + myCanvas.getWidth())
                posX = 40 + myCanvas.getWidth() - rect.getWidth();
            if (posY < 20) posY = 20;
            else if (posY + rect.getHeight() > 20 + myCanvas.getHeight())
                posY = 20 + myCanvas.getHeight() - rect.getHeight();
            rect.setX(posX);
            rect.setY(posY);
        });
 
// привязки холста
        AnchorPane.setLeftAnchor(myCanvas, 40.0);
        AnchorPane.setTopAnchor(myCanvas, 20.0);
        rootPane.getChildren().add(myCanvas);
        rootPane.getChildren().add(rect);
        myStage.show();
    }
}
1
0 / 0 / 5
Регистрация: 24.12.2016
Сообщений: 56
27.03.2017, 14:42  [ТС]
Значит, для strokeLine в классе GraphicsContext, нельзя применять setOnMouseDragged
потому как если написать
Java
1
myCanvas.setOnMouseDragged(e -> {
то будет перемещаться холст со всем содержанием,
также нельзя применять и класс
Java
1
getTransforms()
например
Java
1
2
3
4
Scale scale1 = new Scale();
scale1.setX(30); 
scale1.setY(30);
myCanvas.getTransforms().add(scale1);
в этом случае масштабируется холст со всем содержимым, конечно можно масштабировать через переменные
а если потребуется сначала одну strokeLine повернуть мышью, затем вторую, а остальные не трогать.

А если мне требуется мышью перенести одну линию затем вторую, при этом первая должна оставаться на месте, затем перенести третью, а остальные линии также оставаться на месте получается в этом случае в javaFx рисовать лучше объектами,
в виде
Java
1
2
Line line = new Line();
Rectangle r = new Rectangle();
потому как к этим объектам можно применять
Java
1
2
setOnMouseDragged
getTransforms();
или можно по очереди при помощи мыши переносить strokeLine нарисованные в одном Canvas?
Что-то я на сайте https://docs.oracle.com по этом не могу ничего найти
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2017, 14:42
Помогаю со студенческими работами здесь

Как нарисовать линию на Java.awt.Canvas?
Здравствуйте. Необходимо написать программу, которая рисует линии на Canvas. Для этого есть метод paint(), но он требует объект типа...

Как нарисовать линию на Canvas, если известны координаты начала и конца?
Существует 4 переменных типа (Инт) допустим Х1=20; X2=40; Y1=50; y2=10; я перемещаю перо в точку (х1.у1) ...

Canvas html5, как разместить черный пискель в центре canvas'a?
как разместить черный пискель в центре canvas'a?

Можно ли одной процедурой рисовать на Image.Canvas и Printer.Canvas
Здравствуйте, пожалуйста, подскажите можно ли одной процедурой рисовать на Image.Canvas и Printer.Canvas?

построить функцию y=kx+b (линейная функция) с помощью Vcart или canvas (form.canvas)
Надо построить функцию y=kx+b (линейная функция) с помощью Vcart или canvas (form.canvas)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru