Перетаскивание объекта, сразу после его создания.код внутри - 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);}
}