我正在尝试将一个矩形拖动到VBox,然后从VBox内部再次拖动它。
如果矩形被放置在目标VBox之外的任何位置,那么它应该将其位置恢复到它所属的位置:如果它是左VBox的子级,则将其重置回其中;如果它是右VBox的子级,则将其重置回右VBox内部。
第一部分工作正常,我可以将其拖到VBox并将其添加为子级。第二部分是我遇到问题的地方。
package application;
import javafx.application.Application;
import javafx.event.Event;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class DragNodeMultipleTimes extends Application {
private Disk sourceDisk = new Disk();
private VBox targetVBox = new VBox();
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) {
// Build the UI
GridPane root = getUI();
// Add the event handlers
this.addEventHandlers();
Scene scene = new Scene(root, 800, 600);
stage.setScene(scene);
stage.show();
}
private GridPane getUI() {
GridPane pane = new GridPane();
VBox sourceVBox = new VBox();
sourceDisk.setWidth(90);
sourceDisk.setHeight(20);
sourceVBox.setStyle(" -fx-border-color:red; -fx-border-width: 1; -fx-border-style: solid;");
targetVBox.setStyle(" -fx-border-color:green; -fx-border-width: 1; -fx-border-style: solid;");
sourceVBox.getChildren().add(sourceDisk);
targetVBox.getChildren().add(new Rectangle(200, 20));
pane.setHgap(200);
pane.addColumn(0, sourceVBox);
pane.addColumn(1, targetVBox);
pane.setPadding(new Insets(200, 100, 200, 100));
return pane;
}
private void addEventHandlers() {
sourceDisk.setOnMousePressed(event -> {
sourceDisk.setOrgSceneX(event.getSceneX());
sourceDisk.setOrgSceneY(event.getSceneY());
sourceDisk.setOrgTranslateX(sourceDisk.getTranslateX());
sourceDisk.setOrgTranslateY(sourceDisk.getTranslateY());
sourceDisk.setMouseTransparent(true);
event.consume();
});
sourceDisk.setOnDragDetected(event -> sourceDisk.startFullDrag());
sourceDisk.setOnMouseDragged(event -> {
double offsetX = event.getSceneX() - sourceDisk.getOrgSceneX();
double offsetY = event.getSceneY() - sourceDisk.getOrgSceneY();
double newTranslateX = sourceDisk.getOrgTranslateX() + offsetX;
double newTranslateY = sourceDisk.getOrgTranslateY() + offsetY;
sourceDisk.setTranslateX(newTranslateX);
sourceDisk.setTranslateY(newTranslateY);
});
sourceDisk.setOnMouseReleased(event -> {
//reset the position of the disk
sourceDisk.setTranslateX(0);
sourceDisk.setTranslateY(0);
sourceDisk.setMouseTransparent(false);
});
targetVBox.setOnMouseDragEntered(Event::consume);
targetVBox.setOnMouseDragOver(event -> System.out.println("VBox: mouseDragOver"));
targetVBox.setOnMouseDragReleased(event -> {
((VBox) (event.getSource())).getChildren().add(0, sourceDisk);
//reset translate values
sourceDisk.setTranslateX(0);
sourceDisk.setTranslateY(0);
sourceDisk.setMouseTransparent(false);
});
}
private class Disk extends Rectangle {
private double orgSceneX;
private double orgSceneY;
private double orgTranslateX;
private double orgTranslateY;
public double getOrgSceneX() {
return orgSceneX;
}
public void setOrgSceneX(double orgSceneX) {
this.orgSceneX = orgSceneX;
}
public double getOrgSceneY() {
return orgSceneY;
}
public void setOrgSceneY(double orgSceneY) {
this.orgSceneY = orgSceneY;
}
public double getOrgTranslateX() {
return orgTranslateX;
}
public void setOrgTranslateX(double orgTranslateX) {
this.orgTranslateX = orgTranslateX;
}
public double getOrgTranslateY() {
return orgTranslateY;
}
public void setOrgTranslateY(double orgTranslateY) {
this.orgTranslateY = orgTranslateY;
}
}
}
重现问题的步骤:<br>1)将左矩形拖动到右矩形的顶部(在VBox内部)<br>2)将新添加的矩形拖动到VBox之外的位置<br>3)释放鼠标按钮
问题出现在步骤2。我期望的是,VBox不再从鼠标获取任何事件,因为它离开了它的边界。这不会发生,从控制台输出中可以看出(onMouseDragOver仍然被调用)
在步骤3,抛出异常,但这是因为它试图将相同的矩形添加回VBox。
我所期望的是,如果我将矩形拖动到右VBox外部并释放鼠标,则矩形将重置其位置,使其返回到右VBO内部。
基本上,我想弄清楚的是,即使光标不在VBox的范围内,它如何仍然接收到MOUSE_DRAGGED事件?< br >我也乐于接受实现这一结果的其他方法的建议。
我不太确定,但我有一个假设。磁盘被添加为 VBox 的子级,因此它被视为 VBox 的一部分,适用于 VBox 的相同事件也适用于磁盘。因此,由于磁盘是VBox的一部分,因此当您拖动其子级时,鼠标仍然在VBox中
我认为是这样的:如果一个孩子收到一个事件,所有的父母都会收到。
因此,一旦磁盘被拖到外面,您就需要将其从VBox中移除。
在JavaFX中,我试图通过单击并拖动节点来移动它。如果节点不旋转,它工作得很好,但是当我旋转它时,它开始表现得很奇怪。 在45°左右,当我移动它时,它开始抖动,在60°时,它剧烈地来回抖动。在90°时,只要我开始移动节点,它就会飞离屏幕。 下面是我用来旋转和移动节点的代码。它来自连接到节点的鼠标侦听器。 编辑:这是一些示例输出,以及显示不同节点的图片。 未旋转且缓慢向左移动时的输出: 旋转时缓慢
我只是做了一个简单的应用程序,包括FlowPane和一些有按钮的VBoxs。 主类是这样的。 这个画廊.class是扩展FlowPane的主要后台类。 而PlotterPanel就是VBox,有按钮,可以在图库中拖拽。 问题是,当我在图库中拖动绘图器面板时,它第一次就不能被拖动。我在第二次尝试后工作。当我开始拖动时,它显示了拖动框,但是当我尝试放在另一个节点上时,鼠标点显示x符号。但是当目标已经尝
如何在Javafx 2.0中制作可拖动节点。JavaFX专门用于GUI目的,仅我需要一些示例,谢谢
我目前正在使用JavaFX ScrollBar控件,它本身运行良好-但是我对拖动拇指时的“动画”不满意。 更具体地说: 当我快速拖动拇指时,快速加速-拇指动画不会立即跟随,但有点“滞后”-当我停止拖动拇指时的相同行为。。。拇指真正开始/追上预定位置需要一秒钟的时间 这不是繁重的布局计算之类的问题,因为我只是单独渲染ScrollBar而没有任何内容。 是否有一些选项可以让这个“加速动画”/“滞后”消
我试图在JavaFX中执行以下操作。我正在用画布在屏幕上画东西,我希望发生以下事情: 当我点击画布表面时(比如快速按下并释放):有些事情发生了 当我在画布表面拖动时(如按住并移动,然后释放):会发生其他事情 但是如果我拖动,我希望它排除单击操作,所以如果我拖动,如果我单击,会发生什么事情,而不应该发生。不幸的是,当我释放鼠标时,释放和单击事件都会启动,即使我拖动鼠标。