Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx可检索拖放错误_Javafx_Drag And Drop_Draggable_Drag - Fatal编程技术网

Javafx可检索拖放错误

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

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

我将简要说明如何设置代码结构。 我正在拖动的节点扩展StackPane,并从VBox中的ImageView中将这些节点拖动到中心窗格上。然而,这两个都是扩展了BorderPane的主布局的子级,我称之为MainEntry。 在我节点的类中,我有onMousePressed和onmouseDrawled特性以及onContextMenuRequested特性。在MainEntry类中,我还具有拖动功能,当对象第一次从另一个子VBox拖动到子窗格时,该功能可以处理该问题

以下是相关的类/方法:

VBox类:(从中拖动节点)

ImageView iV=新的ImageView(图像);
iV.setId(“图像”);
iV.setOnDragDetected(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
dragAndDrop(iV,iV.getId(),事件);
}
});
我拖动了三个ImageView,这些ImageView是VBox的子对象

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

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();
        }
    });


}
public void registerDragDropped(PView PView){
pView.setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
event.acceptTransferModes(TransferMode.ANY);
System.out.println(“拖拽注册”);
}
});
setOnDragDropped(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
Dragboard db=event.getDragboard();
最终字符串id=db.getString();
double mousePosY=event.getY();
double mousePosX=event.getX();
deviceCounter+=1;
pView.createBoardView(id、deviceCounter、mousePosX、mousePosY);
事件。setDropCompleted(true);
}
});
pView.setOnDragExited(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
event.acceptTransferModes(TransferMode.ANY);
//computerView.setEffect(null);
event.consume();
}
});
}
注意:此方法在我的MainEntry类(BorderPane)中。在这个类中,当我初始化MainEntry的所有其他子节点时

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

public void makeDraggable(节点){
this.setOnMousePressed(neweventHandler()){
@凌驾
公共无效句柄(MouseeEvent事件){
node.getScene().setCursor(Cursor.MOVE);
System.out.println(“按下可拖动鼠标”);
}
});
setOnMouseReleased(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
node.getScene().setCursor(Cursor.DEFAULT);
}
});
setOnMouseDrawed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
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

我已经想出了这个问题的解决办法

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

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

我说的对吗?您正在将图像从一个窗格拖到另一个窗格?如何处理父交换机?在将拖动的节点添加到新节点之前,是否从旧父节点中删除该节点?我不需要。我在左边有一个图标菜单,我拖动我选择的图标。当它被拖到右侧窗格时,它会创建一个新的不同节点。哦,这是一个很好的方法。不幸的是,没有其他想法,除非你准备一个看起来很有挑战性的页面。我说的对吗?你正在将图像从一个窗格拖到另一个窗格?如何处理父交换机?是否从旧paren中删除拖动的节点
Pane line = new Pane();
//add whatever code binds your line to desired places
getChildren.add(0, line); 
//add the other node as child