当前位置: 首页 > 知识库问答 >
问题:

实现形状的拖放

南宫浩皛
2023-03-14

我是JavaFX动画的新手。我正在尝试遵循代码作为另一个大项目的试用;基本上我想用鼠标拖动来移动圆圈,当圆圈在矩形上时,突出显示矩形。如果圆圈落在矩形上,请将其颜色更改为圆圈的颜色。

到目前为止,我已经设法用鼠标移动圆圈,但我不确定为什么矩形的OnDragEntered方法什么都不做。

以下是FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.sc.colordx.controller.D15Controller">
  <children>
<Rectangle fx:id="r1" arcHeight="5.0" arcWidth="5.0" fill="WHITE" height="152.0" layoutX="33.0" layoutY="14.0" onDragDropped="#fillBox" onDragEntered="#highlightBox" pickOnBounds="true" stroke="BLACK" strokeType="INSIDE" width="52.5" />
<Rectangle fx:id="r2" arcHeight="5.0" arcWidth="5.0" fill="WHITE" height="152.0" layoutX="91.0" layoutY="14.0" onDragDropped="#fillBox" onDragEntered="#highlightBox" stroke="BLACK" strokeType="INSIDE" width="52.5" />
<Circle fx:id="c1" fill="DODGERBLUE" layoutX="348.0" layoutY="262.0" onDragDetected="#startDrag" onMouseDragged="#moveCircle" onMouseReleased="#removeBind" radius="54.5" stroke="BLACK" strokeType="INSIDE" />
<Circle id="c1" fx:id="c2" fill="#ff3d00" layoutX="217.0" layoutY="262.0" onDragDetected="#startDrag" onMouseDragged="#moveCircle" onMouseReleased="#removeBind" radius="54.5" stroke="BLACK" strokeType="INSIDE" />
  </children>
</AnchorPane>

这是控制器:

包装com.sc.colordx.controller;

    import java.awt.Point;
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.animation.TranslateTransition;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.input.DragEvent;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.shape.Circle;
    import javafx.scene.shape.Rectangle;
    import javafx.util.Duration;


        public class D15Controller implements Initializable {
        @FXML
        private Circle c1;
        @FXML
        private Rectangle r1;

        // Animation Data
        private static final Duration TRANSLATE_DURATION      = Duration.seconds(0.25);
        private TranslateTransition transition;
        @FXML
        private Circle c2;
        @FXML
        private Rectangle r2;
        /**
         * Initializes the controller class.
         */
        @Override
        public void initialize(URL url, ResourceBundle rb) 
        {
            // TODO
            transition = createTranslateTransition(c1);


        }    
        private TranslateTransition createTranslateTransition(final Circle circle) {
        final TranslateTransition transition = new TranslateTransition(TRANSLATE_DURATION, circle);

        return transition;
        }

        @FXML
        private void removeBind(MouseEvent event) 
        {
            if(event.getSource() instanceof Circle)
            {
                Circle circle = (Circle)event.getSource();
                circle.setOpacity(1);
            }
        }

            private void fillBox(DragEvent event) 
        {
            System.out.println("Drag detected");
            if(event.getGestureTarget() instanceof Rectangle)
            {
                Rectangle target=(Rectangle)event.getGestureTarget();
                Circle source=(Circle)event.getGestureSource();
                target.setFill(source.getFill());
            }
        }
            @FXML
        private void moveCircle(MouseEvent event) 
        {
             Circle circle=null;
            event.setDragDetect(true);

            if(event.getSource() instanceof Circle)
            {

                circle=(Circle)event.getSource();

                circle.setOpacity(0.25);
                if (!event.isControlDown()) 
                {
                    circle.setCenterX(event.getX());
                    circle.setCenterY(event.getY());
                }   
                else 
                {
                    transition.setToX(circle.getCenterX());
                    transition.setToY(circle.getCenterY());
                    transition.playFromStart();
                }
            }


        }

       @FXML
        private void startDrag(MouseEvent event)
        {
            if(event.getSource() instanceof  Circle)
            {
                Circle source=(Circle)event.getSource();
                source.startFullDrag();
            }
        }
        @FXML
            private void highlightBox(DragEvent event) 
        {
            System.out.println("Highlight box");
            if(event.getGestureSource() instanceof Circle)
            {
                Circle source=(Circle)event.getGestureSource();
                Rectangle target=(Rectangle)event.getGestureTarget();
                target.setFill(source.getFill());
            }
        }
    }

这是正确的方法吗?还是我错误地混合了阻力

共有1个答案

郑正阳
2023-03-14

我很久以前就发现了这个问题。但是没有时间在这里更新答案。尽管我不得不说没有一个回应是令人惊讶的。

moveCircle()方法中必须存在以下行:

    1. circle.setMouseTransparent(true);

确保拖动鼠标时,圆圈下的节点可以检测到拖动。

    2. event.consume();

确保此事件已被消耗并且拖动检测事件可以跟进。Highlightbox方法应包含:

event.acceptTransferModes(TransferMode.ANY);

我使用自定义事件处理程序而不是上面提到的事件处理程序完成了任务,因此我不会粘贴整个代码。

 类似资料:
  • 图形界面允许您使用不同的类创建图形。 在下面的代码中,我使用3个不同的类创建形状: 产生屏幕图像: 不幸的是,接口不提供任何用于转换的功能。 例如,要将形状移动到新位置,我使用以下方法: 我不喜欢逻辑的实例。 是否有一种更通用的方法可以在不使用instanceof逻辑的面板周围拖动任何形状? 完整示例:

  • 我正在为一个家庭作业制作一个ms绘画风格的程序。在这个家庭作业中,你应该能够右键点击一个形状并在屏幕上移动它。填充的形状可以在形状内的任何地方右键单击,而未填充的形状则应在形状的边框上右键单击并选择。 我遇到的问题是,当我最初启动程序,绘制和未填充的形状,并尝试拖动它,它会拖动,但一旦我再次放下它,它的行为正确,变得不可拖动,所有未来未填充的形状都相应地行动。 TLDR:我希望所有填充的形状都是可

  • 构造函数方法: PaintComponent方法和MouseDlold、MousePressed和MouseReleased方法:

  • 我有一个网格窗格的圆圈,我希望能够将一个圆圈拖到另一个圆圈之上,并将第一个圆圈的颜色应用于第二个圆圈。 我遇到的问题是,我无法让目标圆检测到dragEntered或dragOver。我已经能够使用标签成功地实现这一点,但由于某些原因,圆圈不会产生相同的效果。 我见过一些准解决方案,涉及设置circle.setMouseTransparent(true),以便被拖动节点下的节点可以看到拖动,但这里也

  • 本文向大家介绍Android实现View的拖拽,包括了Android实现View的拖拽的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现View拖拽的具体代码,供大家参考,具体内容如下 前言 实现View的拖拽,其实原理很简单。无非就是获取手指的位移信息,然后view根据手指的位移信息,移动对应的位置。 首先是获取手机的位移信息就可以根据需求不同分为两种 拖拽view

  • 本节,我们将介绍事件监听器的必杀技——拖放。如果没有Events或其它轻量级的JavaScript库,拖放操作将很难开发。我们可以使用Events来为矩形附加mouseover, mousedown, mousemove, mouseup, 和mouseout事件,来处理不同阶段的拖放操作。 图6-5 拖放图形 操作步骤 按照以下步骤,来拖放一个矩形: 1. 链接到Events类: <scrip