Перетаскивание объекта, сразу после его создания.код внутри - Java
Формулировка задачи:
В этом простом приложение щелчком мыши создаётся обычный круг.
и позднее его можно перетаскивать.
как сделать так ,что бы при создании на клик , не отпуская клавиши мыши объект сразу перетаскивался...а не по повторному клику.
Получается я нажимаю клавишу -> Создаётся круг и сразу же следует за курсором....и перестаёт следовать за ним когда клавиша отпущена.
(перепробовал массу вариантов но так ничего путного и не вышло, надеюсь поможете разобраться.)
package createnodeconnect; import java.util.Random; import javafx.application.Application; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.event.EventHandler; import javafx.geometry.Point2D; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; public class DraqCrcl extends Application { double orgSceneX, orgSceneY,orgTranslateX, orgTranslateY; double newTranslateX=0.0; double newTranslateY=0.0; private final Random rng = new Random(); boolean selectCrcl = false ; Scene scene; @Override public void start(Stage primaryStage) { Pane pane = new Pane(); pane.setOnMousePressed(e -> { if(selectCrcl == false){ Circle crB = createDraggingCircle(e.getX(), e.getY(), 9, pane, randomColor()); pane.getChildren().add(crB); }}); scene = new Scene(pane, 600, 600); primaryStage.setScene(scene); primaryStage.show(); } private Circle createDraggingCircle(double radius, double x, double y, Pane parent, Color fill) { Circle c = new Circle(radius, x, y, fill); ObjectProperty<Point2D> mouseLoc = new SimpleObjectProperty<>(); c.setOnMousePressed(e -> mouseLoc.set(new Point2D(e.getX(), e.getY()))); c.setOnMouseEntered(r -> {selectCrcl = true;}); c.setOnMouseExited(r -> {selectCrcl = false;}); c.setOnMousePressed(mousePressed); c.setOnMouseDragged(mouseDragged); return c ; } private Color randomColor() { return new Color(rng.nextDouble(), rng.nextDouble(), rng.nextDouble(), 1); } EventHandler<MouseEvent> mousePressed = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { orgSceneX = t.getSceneX(); orgSceneY = t.getSceneY(); orgTranslateX = ((Node)(t.getSource())).getTranslateX(); orgTranslateY = ((Node)(t.getSource())).getTranslateY(); }}; EventHandler<MouseEvent> mouseDragged = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { double offsetX = t.getSceneX() - orgSceneX; double offsetY = t.getSceneY() - orgSceneY; newTranslateX = orgTranslateX + offsetX; newTranslateY = orgTranslateY + offsetY; ((Node)(t.getSource())).setTranslateX(newTranslateX); ((Node)(t.getSource())).setTranslateY(newTranslateY); }}; public static void main(String[] args) { launch(args); } }
Вот почти работает вроде)но всё равно подсказки не помешают
package createnodeconnect; import java.util.Random; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; public class DraqCrcl extends Application { double orgSceneX, orgSceneY,orgTranslateX, orgTranslateY; double newTranslateX=0.0; double newTranslateY=0.0; private final Random rng = new Random(); boolean selectCrcl = false ; Scene scene; @Override public void start(Stage primaryStage) { Pane pane = new Pane(); pane.setOnMousePressed(e -> { if(selectCrcl == false){ Circle crB = createDraggingCircle(e.getX(), e.getY(), 9, pane, randomColor()); pane.getChildren().add(crB); }}); pane.setOnMouseDragged(e -> { pane.getChildren().get(pane.getChildren().size()-1).setTranslateX(e.getX()); pane.getChildren().get(pane.getChildren().size()-1).setTranslateY(e.getY()); }); scene = new Scene(pane, 600, 600); primaryStage.setScene(scene); primaryStage.show(); } private Circle createDraggingCircle(double radius, double x, double y, Pane parent, Color fill) { Circle c = new Circle(radius, x, y, fill); c.setOnMouseEntered(r -> {selectCrcl = true;}); c.setOnMouseExited(r -> {selectCrcl = false;}); c.setOnMousePressed(mousePressed); c.setOnMouseDragged(mouseDragged); return c ; } private Color randomColor() { return new Color(rng.nextDouble(), rng.nextDouble(), rng.nextDouble(), 1); } EventHandler<MouseEvent> mousePressed = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { orgSceneX = t.getSceneX(); orgSceneY = t.getSceneY(); orgTranslateX = ((Node)(t.getSource())).getTranslateX(); orgTranslateY = ((Node)(t.getSource())).getTranslateY(); }}; EventHandler<MouseEvent> mouseDragged = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { double offsetX = t.getSceneX() - orgSceneX; double offsetY = t.getSceneY() - orgSceneY; newTranslateX = orgTranslateX + offsetX; newTranslateY = orgTranslateY + offsetY; ((Node)(t.getSource())).setTranslateX(newTranslateX); ((Node)(t.getSource())).setTranslateY(newTranslateY); }}; public static void main(String[] args) { launch(args); } }
Решение задачи: «Перетаскивание объекта, сразу после его создания.код внутри»
textual
Листинг программы
package sample; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; import java.util.Random; public class DragCircle extends Application { private Random rnd = new Random(); private boolean select = false; @Override public void start(Stage primaryStage) throws Exception { AnchorPane pane = new AnchorPane(); Scene scene = new Scene(pane); primaryStage.setScene(scene); scene.setOnMousePressed(event -> { Circle circle = new Circle(event.getX(), event.getY(), 20, randomColor()); pane.getChildren().add(circle); select = true; }); scene.setOnMouseDragged(event -> { if (select) { ((Circle) pane.getChildren().get(pane.getChildren().size() - 1)).setCenterX(event.getX()); ((Circle) pane.getChildren().get(pane.getChildren().size() - 1)).setCenterY(event.getY()); } }); scene.setOnMouseReleased(event -> select = false); primaryStage.show(); } private Color randomColor() {return new Color(rnd.nextDouble(), rnd.nextDouble(), rnd.nextDouble(), 1);} }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д