【问题标题】:JavaFX: Loosing undecorated window while dragging itJavaFX:拖动时丢失未装饰的窗口
【发布时间】:2015-03-21 07:16:39
【问题描述】:

我有一个未装饰的阶段,我在其中添加了一个 AnchorPane,其中包含两个 AnchorPains(一个标题栏和一个 mainContent)。为了像普通窗口一样使用这个窗口,我实现了 p.e.用于在侧面调整大小并将其拖动到标题栏上的功能。为了拖动窗口,我分析了鼠标事件 onMouseDragged 和 onMousePressed(参见下面的源代码)。源代码基本上可以工作。但是我有一个问题,如果我移动鼠标太快,窗口将不会移动。一开始鼠标在标题栏上。在此之后,我将鼠标移动到一侧太快,使其位于窗口之外并且不再被拖动。只要我回到标题栏,我就可以再次移动它。有没有人建议如何解决这个问题?是否可以将窗口绑定到鼠标Cursor?

这是我的源代码:

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

    }
  });

【问题讨论】:

标签: javafx draggable stage


【解决方案1】:

我找到了解决方案。对于每个人都如何感兴趣:问题是 titlecontent.setOnMouseDragged 函数中的 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);
            }

}

因此,这里有一个完整的解决方案,用于拖动未装饰的舞台并调整其大小。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2012-10-23
    • 1970-01-01
    • 2013-08-12
    • 2013-09-18
    • 2017-12-05
    • 2017-04-18
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多