JavaFX:拖动未装饰的窗口时将其松开

JavaFX:拖动未装饰的窗口时将其松开,javafx,draggable,stage,Javafx,Draggable,Stage,我有一个未装饰的舞台,我添加了一个含有两个主播(一个标题栏和一个主要内容)的主播。为了像普通窗口一样使用此窗口,我实现了p.e.函数,用于在侧面调整其大小,并将其拖动到标题栏上。要拖动窗口,我分析MouseEvents onmousedrable和onMousePressed(请参阅下面的源代码)。源代码基本上正常工作。但是我的问题是,如果我移动鼠标太快,窗口将不会移动。开始时,鼠标位于标题栏上。在这之后,我把鼠标移到一边太快了,这样它就在窗口外面,不再被拖动了。只要我回到标题栏,我就可以再次移

我有一个未装饰的舞台,我添加了一个含有两个主播(一个标题栏和一个主要内容)的主播。为了像普通窗口一样使用此窗口,我实现了p.e.函数,用于在侧面调整其大小,并将其拖动到标题栏上。要拖动窗口,我分析MouseEvents onmousedrable和onMousePressed(请参阅下面的源代码)。源代码基本上正常工作。但是我的问题是,如果我移动鼠标太快,窗口将不会移动。开始时,鼠标位于标题栏上。在这之后,我把鼠标移到一边太快了,这样它就在窗口外面,不再被拖动了。只要我回到标题栏,我就可以再次移动它。有人对如何解决这个问题有什么建议吗?是否可以将窗口绑定到鼠标光标

以下是我的源代码:

    titleContent.setOnMousePressed(new EventHandler<MouseEvent>() {
        public void handle(MouseEvent mouseEvent) {
                Stage stage = (Stage) titleContent.getScene().getWindow();
                Screen screen = Screen.getPrimary();
                Rectangle2D bounds = screen.getVisualBounds();

                if (mouseEvent.getClickCount()==1){
                // record a delta distance for the drag and drop operation.
                    if (stage.getWidth()==bounds.getMaxX() && stage.getHeight()==bounds.getMaxY()){
                        wasMaximized =true;
                    }

                    if(!wasMaximized){
                        dragDelta.x = stage.getX() - mouseEvent.getScreenX();
                        dragDelta.y = stage.getY() - mouseEvent.getScreenY();
                    }
                    else{
                        dragDelta.x=-1*minWidth/2;
                        dragDelta.y=0;
                        wasMaximized=false;
                    }
                }
        }
    });

    titleContent.setOnMouseDragged(new EventHandler<MouseEvent>() {
        public void handle(MouseEvent mouseEvent) {
                Scene scene = (Scene) titleContent.getScene();
                if (!(mouseEvent.getX() < border || mouseEvent.getX() > scene.getWidth() -border) && !(mouseEvent.getX() < border && mouseEvent.getY() > scene.getHeight() -border)){
                    Stage stage = (Stage) titleContent.getScene().getWindow();
                    Screen screen = Screen.getPrimary();
                    Rectangle2D bounds = screen.getVisualBounds();


                    if (stage.getWidth()==bounds.getMaxX() && stage.getHeight()==bounds.getMaxY()){
                        stage.setWidth(minWidth);
                        stage.setHeight(minHeight);
                    }

                    stage.setX(mouseEvent.getScreenX() + dragDelta.x);
                    stage.setY(mouseEvent.getScreenY() + dragDelta.y);
                }

    }
  });
titleContent.setOnMousePressed(新的EventHandler(){
公共无效句柄(MouseEvent MouseEvent){
Stage Stage=(Stage)titleContent.getScene().getWindow();
Screen=Screen.getPrimary();
矩形2D边界=screen.getVisualBounds();
如果(mouseEvent.getClickCount()==1){
//记录拖放操作的增量距离。
if(stage.getWidth()==bounds.getMaxX()&&stage.getHeight()==bounds.getMaxY()){
wasmimized=true;
}
如果(!最大化){
dragDelta.x=stage.getX()-mouseEvent.getScreenX();
dragDelta.y=stage.getY()-mouseEvent.getScreenY();
}
否则{
dragDelta.x=-1*最小宽度/2;
dragDelta.y=0;
wasmized=false;
}
}
}
});
titleContent.setOnMouseDrawed(新的EventHandler(){
公共无效句柄(MouseEvent MouseEvent){
Scene Scene=(Scene)titleContent.getScene();
如果(!(mouseEvent.getX()scene.getWidth()-border)和&!(mouseEvent.getX()scene.getHeight()-border)){
Stage Stage=(Stage)titleContent.getScene().getWindow();
Screen=Screen.getPrimary();
矩形2D边界=screen.getVisualBounds();
if(stage.getWidth()==bounds.getMaxX()&&stage.getHeight()==bounds.getMaxY()){
舞台设置宽度(最小宽度);
舞台设置高度(最小高度);
}
setX(mouseEvent.getScreenX()+dragDelta.x);
stage.setY(mouseEvent.getScreenY()+dragDelta.y);
}
}
});

我找到了解决办法。对于所有对此感兴趣的人来说:问题在于titlecontent.setonMouseDrawed函数中的if语句。如果鼠标在给定元素上滑动,则只调用该函数。这就是为什么没有必要在那里使用if语句的原因。正确的函数如下所示:

titleContent.setOnMouseDragged(new EventHandler<MouseEvent>() {
    public void handle(MouseEvent mouseEvent) {
            Scene scene = (Scene) titleContent.getScene();
            if (!(mouseEvent.getX() < border || mouseEvent.getX() > scene.getWidth() -border) && !(mouseEvent.getX() < border && mouseEvent.getY() > scene.getHeight() -border)){
                Stage stage = (Stage) titleContent.getScene().getWindow();
                Screen screen = Screen.getPrimary();
                Rectangle2D bounds = screen.getVisualBounds();


                if (stage.getWidth()==bounds.getMaxX() && stage.getHeight()==bounds.getMaxY()){
                    stage.setWidth(minWidth);
                    stage.setHeight(minHeight);
                }

                stage.setX(mouseEvent.getScreenX() + dragDelta.x);
                stage.setY(mouseEvent.getScreenY() + dragDelta.y);
            }

}
titleContent.setonMouseDrawed(新的EventHandler(){
公共无效句柄(MouseEvent MouseEvent){
Scene Scene=(Scene)titleContent.getScene();
如果(!(mouseEvent.getX()scene.getWidth()-border)和&!(mouseEvent.getX()scene.getHeight()-border)){
Stage Stage=(Stage)titleContent.getScene().getWindow();
Screen=Screen.getPrimary();
矩形2D边界=screen.getVisualBounds();
if(stage.getWidth()==bounds.getMaxX()&&stage.getHeight()==bounds.getMaxY()){
舞台设置宽度(最小宽度);
舞台设置高度(最小高度);
}
setX(mouseEvent.getScreenX()+dragDelta.x);
stage.setY(mouseEvent.getScreenY()+dragDelta.y);
}
}

因此,这里有一个完整的解决方案,用于拖动和调整未装饰阶段的大小。希望它能有所帮助。

看看下面的项目,它实现了拖动功能。也许它可以为您提供正确的方法。