JavaFX可拖动形状转义窗格到整个场景中

JavaFX可拖动形状转义窗格到整个场景中,javafx,shapes,scene,pane,Javafx,Shapes,Scene,Pane,我的程序旨在允许用户在窗格上放置形状,并自由移动它们。我成功地将初始形状放置在窗格上,并在窗格周围移动形状。我遇到的问题是,形状可以拖动到它们应该限制的窗格之外。形状可以拖动到场景中不允许的任何位置(下图) 非常感谢你的帮助。多谢各位 my_pane_for_rectangles.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>(){ @O

我的程序旨在允许用户在窗格上放置形状,并自由移动它们。我成功地将初始形状放置在窗格上,并在窗格周围移动形状。我遇到的问题是,形状可以拖动到它们应该限制的窗格之外。形状可以拖动到场景中不允许的任何位置(下图)

非常感谢你的帮助。多谢各位

    my_pane_for_rectangles.addEventHandler(MouseEvent.MOUSE_PRESSED, 
            new EventHandler<MouseEvent>(){

        @Override
        public void handle(MouseEvent event) {

            if(MouseHasImage == true){
                try {
                    Rectangle rectangle_for_img = new Rectangle();// Creates the rectangle that will hold our image

                    Image my_image = new Image(ClickedAddDevice.image_file.toURI().toURL().toExternalForm());// Select the appropriate image

                    rectangle_for_img.setFill(new ImagePattern(my_image));// Fill the rectangle with the image
                    rectangle_for_img.relocate(event.getX(), event.getY());// Set the X and Y coordinates for our device (based on panel X and Y mouse position)

                    rectangle_for_img.setHeight(my_image.getHeight());// Set the height of the rectangle to the height of the image
                    rectangle_for_img.setWidth(my_image.getWidth());// Set the width of the rectangle to the width of the image

                    rectangle_for_img.setId(placed_button_id);// Set the ID of the rectangle to the name of the device


                    rectangle_for_img.setOnMousePressed(new EventHandler<MouseEvent>(){
                        public void handle(MouseEvent mouse_pressed) {
                                orgSceneX = mouse_pressed.getSceneX();
                                orgSceneY = mouse_pressed.getSceneY();
                                orgTranslateX = rectangle_for_img.getTranslateX();
                                orgTranslateY = rectangle_for_img.getTranslateY();
                        }
                    });

                    rectangle_for_img.setOnMouseDragged(new EventHandler<MouseEvent>(){
                        public void handle(MouseEvent mouse_dragged) {
                            my_scene.setCursor(Cursor.CLOSED_HAND);
                            rectangle_for_img.toFront();
                            isbeingdragged = true;
                            double offsetX = mouse_dragged.getSceneX() - orgSceneX;
                            double offsetY = mouse_dragged.getSceneY() - orgSceneY;
                            double newTranslateX = orgTranslateX + offsetX;
                            double newTranslateY = orgTranslateY + offsetY;

                            rectangle_for_img.setTranslateX(newTranslateX);
                            rectangle_for_img.setTranslateY(newTranslateY);
                        }
                    });

                    rectangle_for_img.setOnMouseReleased(new EventHandler<MouseEvent>(){
                        public void handle(MouseEvent mouse_released) {
                            if(isbeingdragged == true){
                                //System.out.println("Released from drag");
                                my_scene.setCursor(Cursor.DEFAULT);
                                System.out.println("X: " + mouse_released.getX() + ", Y: " + mouse_released.getY());
                            }

                            isbeingdragged = false;
                        }
                    });
my_pane_用于矩形。addEventHandler(MouseEvent.MOUSE_按下,
新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(MouseHasImage==true){
试一试{
矩形矩形_for_img=new Rectangle();//创建保存图像的矩形
Image my_Image=新图像(单击dddevice.Image_file.toURI().toURI().toExternalForm());//选择适当的图像
矩形_表示_img.setFill(新图像模式(我的图像));//用图像填充矩形
矩形_表示_img.relocate(event.getX(),event.getY());//设置设备的X和Y坐标(基于面板X和Y鼠标位置)
矩形_for_img.setHeight(my_image.getHeight());//将矩形的高度设置为图像的高度
矩形_for_img.setWidth(my_image.getWidth());//将矩形的宽度设置为图像的宽度
矩形_表示_img.setId(放置的_按钮_id);//将矩形的id设置为设备的名称
矩形(用于)img.setOnMousePressed(新的EventHandler(){
公共无效句柄(按下鼠标事件鼠标){
orgSceneX=鼠标按下。getSceneX();
orgSceneY=按下鼠标。getSceneY();
orgTranslateX=矩形,表示_img.getTranslateX();
orgTranslateY=矩形,表示\u img.getTranslateY();
}
});
矩形_用于_img.setonMouseDrawed(新的EventHandler()){
公共无效句柄(鼠标事件鼠标拖动){
my_scene.setCursor(光标.闭合的手);
矩形_表示_img.toFront();
IsBeingDrawed=true;
double offsetX=鼠标拖动。getSceneX()-orgSceneX;
double offsetY=鼠标拖动。getSceneY()-orgSceneY;
双新Translatex=orgTranslateX+offsetX;
双新Translatey=orgTranslateY+offsetY;
矩形,用于表示setTranslateX(newTranslateX);
矩形表示设置平移(新平移);
}
});
矩形(用于)img.setOnMouseReleased(新的EventHandler(){
公共无效句柄(已释放MouseeEvent鼠标){
如果(IsBeingDrawed==true){
//System.out.println(“从拖动中释放”);
my_scene.setCursor(Cursor.DEFAULT);
System.out.println(“X:+mouse\u released.getX()+”,Y:+mouse\u released.getY());
}
IsBeingDrawed=false;
}
});

您必须获取平面边界,并使用这些边界将形状保留在其中。的可能重复。您不能问两个问题,先生,请问一个,关于包含节点,您可以检查最大区域,即父节点边界父节点并使拖动停止或暂停,您必须获取平面边界并使用您不能问两个问题,先生,请让它成为一个,关于包含节点,您可以检查最大区域,即您的父节点边界父节点,并使拖动停止或暂停,它