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

Java FX - 在标签上移动拖放事件

叶声
2023-03-14

我在拖放标签时遇到了问题。我无法拖动标签并将其放到另一个标签上。检测到事件setOnDragDetected,但未检测到setOnDrugDropped。这些是文件。

FXML:


           <HBox fx:id="hboxTwo" alignment="CENTER" spacing="100" style="-fx-background-color: orange;">
               <padding>
                   <javafx.geometry.Insets bottom="25" left="25" right="25" top="25" />    
               </padding>
              <children>
                  <Label fx:id="labelTwo" prefHeight="50.0" text="labelTWO" />
              </children>    
           </HBox>
       </children>

    </HBox>

</center>

控制器:

公共类HomeController实现可初始化{

@FXML
Label labelOne;

@FXML
Label labelTwo;

@FXML
HBox hboxOne;

@FXML
HBox hboxTwo;

@Override
public void initialize(URL url, ResourceBundle rb) {
    labelOne.setOnDragDetected((MouseEvent event) -> {
        System.out.println("source::" + event.getSource());
    });

    hboxTwo.setOnDragDropped((DragEvent event) -> {
        event.acceptTransferModes(TransferMode.ANY);
        System.out.println("source::" + event.getSource());
    });

    hboxTwo.setOnDragEntered((DragEvent event) -> {
        event.acceptTransferModes(TransferMode.ANY);
        System.out.println("source::" + event.getSource());
    });
}

}

共有2个答案

耿敏达
2023-03-14
匿名用户

只需复制并粘贴下面,JavaFX 8拖放教程中用于拖放检测和放置的相关代码即可。

当您将示例代码与代码进行比较时,您可以看到缺少一些东西:

    < li >您没有构造包含拖放数据的< code>Dragboard。 < li >您不是在拖放时从Dragboard中提取拖放数据。 < li >您没有通知拖放事件已完成。 < li >您没有恰当地消费事件。
source.setOnDragDetected(new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) {
        /* drag was detected, start a drag-and-drop gesture*/
        /* allow any transfer mode */
        Dragboard db = source.startDragAndDrop(TransferMode.ANY);

        /* Put a string on a dragboard */
        ClipboardContent content = new ClipboardContent();
        content.putString(source.getText());
        db.setContent(content);

        event.consume();
    }
});

target.setOnDragOver(new EventHandler<DragEvent>() {
    public void handle(DragEvent event) {
        /* data is dragged over the target */
        /* accept it only if it is not dragged from the same node 
         * and if it has a string data */
        if (event.getGestureSource() != target &&
                event.getDragboard().hasString()) {
            /* allow for moving */
            event.acceptTransferModes(TransferMode.MOVE);
        }

        event.consume();
    }
});

target.setOnDragDropped(new EventHandler<DragEvent>() {
    public void handle(DragEvent event) {
        /* data dropped */
        /* if there is a string data on dragboard, read it and use it */
        Dragboard db = event.getDragboard();
        boolean success = false;
        if (db.hasString()) {
           target.setText(db.getString());
           success = true;
        }
        /* let the source know whether the string was successfully 
         * transferred and used */
        event.setDropCompleted(success);

        event.consume();
     }
});

巢权
2023-03-14

要使setOnDragDropped工作,您必须先设置TransferMode

 boxTwo.setOnDragOver((DragEvent event) -> {
        event.acceptTransferModes(TransferMode.ANY);
        event.consume();
 });

 boxTwo.setOnDragDropped((DragEvent event) -> {
        Label source = (Label) event.getGestureSource();
        boxTwo.getChildren().add(source);

        event.setDropCompleted()
        event.consume();
 });

 类似资料:
  • 拖放(Drag’n’Drop)是一个很赞的界面解决方案。取某件东西并将其拖放是执行许多东西的一种简单明了的方式,从复制和移动文档(如在文件管理器中)到订购(将物品放入购物车)。 在现代 HTML 标准中有一个 关于拖放的部分,其中包含了例如 dragstart 和 dragend 等特殊事件。 这些事件使我们能够支持特殊类型的拖放,例如处理从 OS 文件管理器中拖动文件,并将其拖放到浏览器窗口中。

  • 我尝试了几乎所有的方法,但是鼠标拖动事件没有触发,就像这里解释的那样: https://openjfx.io/javadoc/11/javafx.graphics/javafx/scene/input/MouseDragEvent.html 下面是一个简单的示例,您可以尝试一下(我在JavaFX11.0.2中使用Java11): 我想通过在或中获取的引用。有许多嵌套窗格等,因为我想保持原来的项目布

  • 问题内容: 因此,正如标题所述,我想在鼠标拖动时移动椭圆。我先声明了椭圆并将其画出(因为我有8个椭圆,它们带有不同的颜色信息。四个是白色,另一个是红色)。我尝试做我对矩形所做的事情: 但这似乎不起作用。它给我一个错误 我有点困惑,因为我已经阅读了文档,并且Ellipse2D.Double存在这样的变量。 这是一个MCVE: 那么是否有替代算法,或者我只是在语法上缺少什么?我想知道解决方案。谢谢。

  • 问题内容: 我想通过覆盖JLabel上的鼠标事件来启用JLabel上的拖放功能,但是当我在mousePressed事件中定义拖放时,mouseReleased对该JLabel无效。难道我做错了什么 ? 缩略图是JLabel的数组 运行该程序时,拖放有效,但不会打印“此处释放鼠标”语句。但是,当我从mousePressed()方法中删除负责DND的代码时,将打印“此处释放了鼠标”。 这段代码有什么问

  • 我已经在我的游戏中实现了拖放功能,但到目前为止,我只能“拖放”到硬编码的位置。如图所示: 我想要的是: 当船舶被丢弃时,它的x、y值(相对于GridPane)被保存,或者 飞船掉落到的细胞被保存。 我的setOnDragDropped事件在此处处理: 我觉得这应该是一个简单的鼠标悬停事件或类似的事情,但我不知道该怎么做。 编辑:下面类的完整代码: }

  • 我在做拖放。我正在将一些按钮从一个VBox拖动到另一个VBbox。我现在看到的是,只有当鼠标光标进入目标的边界时,才会触发OnDragEnter事件。 我的问题是:当源按钮边框与目标列表边框重叠时,如何触发拖动事件(或其他事件)? 非常感谢你