내가 응용 프로그램 제공하려면 드래그 앤 드롭하기 위해 드래그 시작을 지연하는 방법 : (여기 사각형)움직임을 결합하여 동적으로
- 주변의 이미지를 이동할 수 있습니다
- 그 객체가있는 경우를 작업 영역에서 이동, 캔버스 영역에 객체를 이동하는 동안 너무 빨리 와서 다른 응용 프로그램
을 따라서 자바 FX DragDetected (에 transfere에 대한 끌어서 놓기)를 시작, 내가)합니다 (onDragDetected 억제 처리하고 onMouseDragged() 핸들러에서 MouseDra를 변환하려고했습니다.
event.setDragDetect(true);
그러나 onDragDetected()가 결코 다시 오실를 사용하여 드래그 이벤트에 g 이벤트 ..... 내가 무엇을 할 수 있습니까?
전체 샘플 응용 프로그램은 다음과 같습니다
가package fx.samples;
import java.io.File;
import java.util.LinkedList;
import javax.imageio.ImageIO;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Bounds;
import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.image.WritableImage;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class DragRectangle extends Application {
Point2D lastXY = null;
public void start(Stage primaryStage) {
Pane mainPane = new Pane();
Scene scene = new Scene(mainPane, 500, 500);
primaryStage.setScene(scene);
primaryStage.show();
Rectangle area = new Rectangle(0, 0, 500 , 500);
Rectangle rect = new Rectangle(0, 0, 30, 30);
rect.setFill(Color.RED);
mainPane.getChildren().add(rect);
rect.setOnMouseDragged(event -> {
System.out.println("Move");
Node on = (Node)event.getTarget();
if (lastXY == null) {
lastXY = new Point2D(event.getSceneX(), event.getSceneY());
}
double dx = event.getSceneX() - lastXY.getX();
double dy = event.getSceneY() - lastXY.getY();
on.setTranslateX(on.getTranslateX()+dx);
on.setTranslateY(on.getTranslateY()+dy);
lastXY = new Point2D(event.getSceneX(), event.getSceneY());
if (!area.intersects(event.getSceneX(), event.getSceneY(), 1, 1)) {
System.out.println("->Drag");
event.setDragDetect(true);
} else {
event.consume();
}
});
rect.setOnDragDetected(event -> {
System.out.println("Drag:"+event);
if (area.intersects(event.getSceneX(), event.getSceneY(), 1, 1)) { event.consume(); return; }
Node on = (Node)event.getTarget();
Dragboard db = on.startDragAndDrop(TransferMode.COPY);
db.setContent(makeClipboardContent(event, on, null));
event.consume();
});
rect.setOnMouseReleased(d -> lastXY = null);
}
public static ClipboardContent makeClipboardContent(MouseEvent event, Node child, String text) {
ClipboardContent cb = new ClipboardContent();
if (text != null) {
cb.put(DataFormat.PLAIN_TEXT, text);
}
if (!event.isShiftDown()) {
SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT);
Bounds b = child.getBoundsInParent();
double f = 10;
params.setViewport(new Rectangle2D(b.getMinX()-f, b.getMinY()-f, b.getWidth()+f+f, b.getHeight()+f+f));
WritableImage image = child.snapshot(params, null);
cb.put(DataFormat.IMAGE, image);
try {
File tmpFile = File.createTempFile("snapshot", ".png");
LinkedList<File> list = new LinkedList<File>();
ImageIO.write(SwingFXUtils.fromFXImage(image, null),
"png", tmpFile);
list.add(tmpFile);
cb.put(DataFormat.FILES, list);
} catch (Exception e) {
}
}
return cb;
}
public static void main(String[] args) {
launch(args);
}
}
"당신의 가정 () 어떤 시점에서 드래그 이벤트가 작동하지 않습니다. " -> 히스테리시스로 끌기가 시작되기 전에 (내가 첫 번째 이동 이벤트에서 드래그를 시작하기 전에) 그렇게하면 작동합니다 ... 그래서 나중에도 작동하기를 바랍니다. –
나는 fireEvent()를 사용하여 이미 다음과 같은 결과를 얻었습니다. Exception "DRAG_DETECTED 이벤트 핸들러 외부로 드래그 앤 드롭을 시작할 수 없습니다"... (슬픈 방법) –
내 응용 프로그램에서 드래그 앤 드롭을 처음 구현했습니다. ,하지만 그것은 객체의 드래그 된 아이콘이 즉시 가운데에 위치하므로 매우 나쁜 사용자 피드백을 제공하고, 이미지가 더 크면 축소되어 표시됩니다. 따라서 드롭에 대한 정확한 배치는 사용자에게 알려지지 않습니다. 그래서 나는 이동 중에 응용 프로그램이 남아있을 경우에만 끌기를 시작하기로 결정했습니다. 도움을 주셔서 감사합니다,하지만 난 여전히이 문제에 대한 해결책이 필요합니다. –