Javafx可检索的拖放错误



我正在创建一个具有拖放功能的javafx应用程序。我需要能够从一个窗格拖放到下一个窗格。删除后,所有删除的节点都需要可访问。拖放工作顺利。但是,我遇到了一个问题,即删除后并非所有节点都可以访问。我会拖动一个节点并单击它,有时它会响应,但有时当我单击它时,随机节点将不再显示功能。没有明显的模式(我可以看到(哪些节点停止工作,哪些节点始终有效。如果有人知道为什么这可能是一个问题或如何解决它,将不胜感激。几年前,我到处寻找,只发现了一个类似的问题,但是包含其解决方案的页面已被删除。

我将简要说明如何设置代码结构。 我正在拖动的节点扩展了StackPane,我将这些节点从VBox中的ImageView拖到中心窗格上。但是,这两个都是扩展BorderPane的主布局的子布局,我称之为MainEntrance。 在我的节点类中,我有 onMousePress 和 onMouseDragged 功能以及 onContextMenuRequest 功能。在 MainEntrance 类中,我也有拖动功能,当对象首次从另一个子 VBox 拖动到子窗格上时,该功能将句柄。

以下是相关的类/方法:

VBox 类:(从中拖动节点的位置(

ImageView iV= new ImageView(image);
iV.setId("image");
iV.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
dragAndDrop(iV, iV.getId(), event);
}
});

我拖动了三个图像视图,这些图像视图是VBox的子级。

主入口: 在此类中,我有一个方法可以将我的拖动事件注册到我的窗格,如下所示: PView 是我的 Pane 类扩展

public void registerOnDragDropped(PView pView){

pView.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
event.acceptTransferModes(TransferMode.ANY);
System.out.println("drag over registered");
}
});

pView.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
Dragboard db = event.getDragboard();
final String id = db.getString();
double mousePosY = event.getY();
double mousePosX = event.getX();
deviceCounter += 1;
pView.createBoardView(id, deviceCounter, mousePosX, mousePosY);
event.setDropCompleted(true);
}
});
pView.setOnDragExited(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
event.acceptTransferModes(TransferMode.ANY);
//computerView.setEffect(null);
event.consume();
}
});

}

注意:此方法在我的MainEntry类(BorderPane(中。在此类中,当我初始化 MainEntry 的所有其他子节点时。

节点:(可拖动节点扩展堆栈窗格( 我的节点的处理程序位于我称为makeDraggable((的方法中

public void makeDraggable(Node node) {
this.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
node.getScene().setCursor(Cursor.MOVE);
System.out.println("makeDraggable mouse pressed");
}
});
node.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
node.getScene().setCursor(Cursor.DEFAULT);
}
});
node.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
node.setTranslateX(node.getTranslateX() + event.getX() - 35);
node.setTranslateY(node.getTranslateY() + event.getY() - 35);
event.consume();
node.toFront();
}
});
}

如果需要任何其他信息,请告诉我。提前谢谢你!

我已经找到了这个问题的解决方案。

问题出在我放置在节点上的附件的呈现顺序上。因此,当我将节点拖到屏幕上时,我有另一个节点(放置在窗格上的一条线(将屏幕中心绑定到节点。我最初并不认为这是问题所在,所以我甚至没有包括该类或片段。然而,在玩了一下之后,我意识到这确实是问题所在。我不得不将行添加到渲染顺序的顶部。这可以通过允许您创建新节点的任何方法通过以下方式完成:

Pane line = new Pane();
//add whatever code binds your line to desired places
getChildren.add(0, line); 
//add the other node as child

最新更新