繁体   English   中英

停止将Node拖出窗格

Stop dragging Node out of a Pane

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个StackPane,可以在窗格中拖动它(窗格是堆栈窗格的父布局),但是现在我可以将其拖出窗格。 当前,我无法找到一种方法来阻止将StackPane从窗格中拖出窗格。

当您按下StackPane时,我的事件处理程序是:

EventHandler<MouseEvent> circleOnMousePressedEventHandler = 
            new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {

                currentStackPane  = ((StackPane)(t.getSource()));
                orgSceneX = t.getSceneX();
                orgSceneY = t.getSceneY();
                layoutX =  currentStackPane.getLayoutX();
                layoutY =  currentStackPane.getLayoutY();

            }
        };

我拖动StackPane时的事件处理程序:

EventHandler<MouseEvent> circleOnMouseDraggedEventHandler = 
            new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {


                double offsetX = t.getSceneX() - orgSceneX;
                double offsetY = t.getSceneY() - orgSceneY;
                currentStackPane.setTranslateX(offsetX);
                currentStackPane.setTranslateY(offsetY);
             }
        };

我放开鼠标时的事件处理程序:

            new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {

                currentStackPane.setLayoutX(layoutX + ((StackPane)(t.getSource())).getTranslateX());
                currentStackPane.setLayoutY(layoutY + ((StackPane)(t.getSource())).getTranslateY());
                currentStackPane.setTranslateX(0);
                currentStackPane.setTranslateY(0);
            }
        };
        return circleOnMouseReleaseEventHandler;

}

有没有一种方法可以使堆栈窗格只能在窗格中拖动。

谢谢。

编辑:

我试过的

我创建了这种方法:

private boolean outSideParentBounds( Bounds childBounds, double newX, double newY) {

    Bounds parentBounds = centerPane.getLayoutBounds();

    //check if too left
    if( parentBounds.getMaxX() <= (newX + childBounds.getMaxX()) ) {
        return true ;
    }

    //check if too right
    if( parentBounds.getMinX() >= (newX + childBounds.getMinX()) ) {
        return true ;
    }

    //check if too down
    if( parentBounds.getMaxY() <= (newY + childBounds.getMaxY()) ) {
        return true ;
    }

    //check if too up
    if( parentBounds.getMinY() >= (newY + childBounds.getMinY()) ) {
        return true ;
    }

    return false;
}

现在,我的拖动事件处理程序如下所示:

EventHandler<MouseEvent> circleOnMouseDraggedEventHandler = 
            new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {


                double offsetX = t.getSceneX() - orgSceneX;
                double offsetY = t.getSceneY() - orgSceneY;

                if( outSideParentBounds(currentStackPane.getLayoutBounds(), layoutX + ((StackPane)(t.getSource())).getTranslateX(), 
                        layoutY + ((StackPane)(t.getSource())).getTranslateY()) ) {  

                    return; 
                }

                currentStackPane.setTranslateX(offsetX);
                currentStackPane.setTranslateY(offsetY);

            }
        };

但是,一旦我将其拖出窗格,它似乎就卡住了窗格的边缘,并且您再也无法将其拖拽了,这似乎不起作用。

1 个回复

我注意到的一个问题是您在计算outSideParentBounds时没有考虑offSet值。 而且,只有在满足条件时,您才能更新转换值。 相反,您必须始终在拖动处理程序中将转换值更新为所需值。

您的拖动处理程序应如下更改:

EventHandler<MouseEvent> circleOnMouseDraggedEventHandler = e -> {
            // Offset of drag
            double offsetX = e.getSceneX() - sceneX;
            double offsetY = e.getSceneY() - sceneY;

            // Taking parent bounds
            Bounds parentBounds = currentStackPane.getParent().getLayoutBounds();

            // Drag node bounds
            double currPaneLayoutX = currentStackPane.getLayoutX();
            double currPaneWidth = currentStackPane.getWidth();
            double currPaneLayoutY = currentStackPane.getLayoutY();
            double currPaneHeight = currentStackPane.getHeight();

            if ((currPaneLayoutX + offsetX > -1) && (currPaneLayoutX + offsetX < parentBounds.getWidth() - currPaneWidth)) {
                // If the dragNode bounds is within the parent bounds, then you can set the offset value.
                currentStackPane.setTranslateX(offsetX);
            } else if (currPaneLayoutX + offsetX < 0) {
                // If the sum of your offset and current layout position is negative, then you ALWAYS update your translate value to negative layout value
                // which makes the final layout position to 0 in mouse released event.
                currentStackPane.setTranslateX(-currPaneLayoutX);
            } else {
                // If your dragNode bounds are outside parent bounds,ALWAYS setting the translate value that fits your node at end.
                currentStackPane.setTranslateX(parentBounds.getWidth() - currPaneLayoutX - currPaneWidth);
            }

            if ((currPaneLayoutY + offsetY < parentBounds.getHeight() - currPaneHeight) && (currPaneLayoutY + offsetY > -1)) {
                currentStackPane.setTranslateY(offsetY);
            } else if (currPaneLayoutY + offsetY < 0) {
                currentStackPane.setTranslateY(-currPaneLayoutY);
            } else {
                currentStackPane.setTranslateY(parentBounds.getHeight() - currPaneLayoutY - currPaneHeight);
            }
        };

始终更新的原因是::拖动事件处理程序不会为您拖动的每个像素调用。 假设您要将一个节点拖动500px。 如果您打印offsetX / Y值,您会注意到offsetX / Y值并非始终是顺序的,或者不会为每个像素打印。 它可能会跳一些值。 它们可能会根据您拖动的速度而变化。 因此,您可能会跳过所需的终点。

为了验证这一点,一旦您熟悉上面的代码,请尝试注释代码的“其他”部分,并仅保留第一个if条件。 尝试快速拖动节点,您会注意到您的节点将随机终止在所需端点的前面/后面。

3 JavaFX拖动窗格

我正在尝试使用以下代码在Java fx应用程序中启用窗格拖动: 但是,当我尝试拖动它时,它每隔几帧就会拖动但也会出现在另一个位置,因此看起来好像在两个位置,当我放开窗格时,它最终会出现在这些位置之一。 有谁知道为什么它不起作用? ...

4 一个拖动窗格附加到另一个窗格

我正在编写MDI应用程序源代码。 不久前,我在应用程序上发现了MFC错误,该标签上还附加了一个拖动标签。 我要附加拖动窗格的窗格有3个可停靠窗格,选项卡如下。 并且,我在标题栏上方的顶部拖动了一个标题为“ Members”的窗格。 然后,选项卡像下面一样长大,我一直在拖动。 ...

5 jQuery可拖动图像,当鼠标超出界限时停止拖动(div)

我在div功能中有一个可拖动的图像。 但是我想这样做,如果用户将鼠标按下并拖动元素/ div时,当鼠标向下或其边界移动时,它将不再可拖动。 在控件上按下按钮时,将启用拖动功能,该按钮功能正常。 我只是希望能够在鼠标离开特定div /元素的边界时停止拖动。 这是复合控件的一部分,因此当 ...

6 jQuery可拖动:当鼠标移出父级时停止拖动

请检查这个jsFIDDLE 这是html代码,我在拖动.button_area: 除了一件事之外,它一直在起作用。 当我单击红色区域(在第二个黄色正方形中)并开始向左拖动(第一个黄色正方形)时,我希望它在鼠标移到第二个黄色正方形(父对象)上时停止拖动过程。...不是可拖动的对象 ...

8 在某个点停止拖动

我正在为我的 PHP 项目创建封面图片。 我想让它像 Facebook 那样我可以上传尺寸大于所需封面尺寸的封面,然后我想上下左右拖动封面,让用户重新定位并根据自己的情况进行设置。 在这个动作中,我可以拖动照片,但如果图像结束,我想停止拖动。 就像用户将图像向左拖动一样,如果 div 的终点与 di ...

9 停止在光滑的旋转木马中拖动

我正在做一个小项目,我正在使用光滑的旋转木马。 问题是我想在第一个和最后一个元素的情况下停止拖动。 知道怎么做吗? 如何在第一个和最后一个元素的情况下停止拖动? ...

2015-08-18 07:49:42 1 1836   jquery
10 停止在jQuery中拖动

我有一个简单的拖动问题。 我有一个包含很多子div的容器(指南)。 单击任何元素后,它将开始拖动父元素,但我似乎无法阻止它向上拖动鼠标: 有任何想法吗? 编辑http://jsfiddle.net/hwvvu2rg/ ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM