JavaFX OnDragDropped不注册 [英] JavaFX OnDragDropped Not Registering

查看:354
本文介绍了JavaFX OnDragDropped不注册的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将标签拖放到彼此之间。



我有一个名为starsAndBars的标签列表,每个标签都将其称为它被创建:

  private void giveDragAndDropProperties(Label label){
//启用拖动操作以拾取标签
label.setOnDragDetected(new EventHandler< MouseEvent>(){
public void handle(MouseEvent event){
System.out.println(Drag and Drop started!);

Dragboard db = label.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
int index = starsAndBars.indexOf(label);
content.putString (test);
db.setContent(content);

event.consume();
}
});

label.setOnDragEntered(new EventHandler< DragEvent>(){
public void handle(DragEvent event){
System.out.println(drag entered!);
}
});

label.setOnDragExited(new EventHandler< DragEvent>(){
public void handle(DragEvent event){
System.out.println(drag left!);
}
});

//启用在此标签上删除的标签
label.setOnDragDropped(new EventHandler< DragEvent>(){
public void handle(DragEvent event){
System.out.println(Drop occurred!);
}
});
}

当我尝试执行拖放操作时,这就是我所看到的:

 拖放开始! 
拖动输入!
向左拖动!
拖动输入!
<我在这里释放鼠标>
向左拖动!

据我所知,onDragDropped事件从未注册。我究竟做错了什么?我可以告诉每个标签都有拖放事件处理程序,因为它们注册了已输入和退出事件。这是处理拖放事件处理程序的唯一代码片段,因此它应该先被别的东西消费。



所有这些标签都在一个HBox这是在一个ScrollPane内,如果这有任何区别。



编辑:我现在尝试在HBox上放置一个放置事件标签包含相同的结果 - 它从来没有被称为。我的代码为setOnDragDropped与我的另一个例子中的代码基本相同。



我已经尝试重写我的setOnDragDetected和setOnDragDropped,我正在尝试匹配它们到这个例子( http://docs.oracle.com/javafx/2 /drag_drop/jfxpub-drag_drop.htm ),这对我来说是有效的。



编辑2:我有另一个项目,目前有拖动和使用与这个事件几乎相同的事件的drop事件,尽管使用不同的对象 - 我尝试从该项目复制源(并更改变量名),没有运气。我也可以包括这个来源,如果可能有帮助的话。但是它基本上是一样的。



我可以包括什么来帮助达成答案?

解决方案

您需要在 setOnDragOver 中接受转移模式,如下所示:

  label.setOnDragOver(new EventHandler< DragEvent>(){

public void handle(DragEvent event){
event.acceptTransferModes(TransferMode.ANY);
event.consume();
}
});


I am trying to drag and drop labels on top of each other.

I have a list of labels called starsAndBars, and every label has this called on it as it is created:

private void giveDragAndDropProperties(Label label) {
    //Enable drag actions to pick up the label
    label.setOnDragDetected(new EventHandler<MouseEvent>() {
        public void handle(MouseEvent event) {
            System.out.println("Drag and drop started!");

            Dragboard db = label.startDragAndDrop(TransferMode.ANY);
            ClipboardContent content = new ClipboardContent();
            int index = starsAndBars.indexOf(label);
            content.putString("test");
            db.setContent(content);

            event.consume();
        }
    });

    label.setOnDragEntered(new EventHandler<DragEvent>() {
        public void handle(DragEvent event) {
            System.out.println("drag entered!");
        }
    });

    label.setOnDragExited(new EventHandler<DragEvent>() {
        public void handle(DragEvent event) {
            System.out.println("drag left!");
        }
    });

    //Enable a label to be dropped on this label
    label.setOnDragDropped(new EventHandler<DragEvent>() {
        public void handle(DragEvent event) {
            System.out.println("Drop occurred!");
        }
    });
}

When I attempt to perform a drag and drop operation, this is what I see:

Drag and drop started!
drag entered!
drag left!
drag entered!
<I release the mouse here>
drag left!

The "onDragDropped" event never registers, as far as I can tell. What am I doing wrong? I can tell that each Label has the drag and drop event handlers since they register the "entered" and "exited" events. This is the only piece of code that deals with Drag and Drop event handlers - so it should be being consumed by something else first.

All of these labels are in an HBox that is within a ScrollPane, if that makes any difference.

Edit: I have now tried putting a drop event on the HBox the labels are contained in with the same result - it never seems to get called. My code for that setOnDragDropped was essentially identical to the one in my other example.

I have tried rewriting both my setOnDragDetected and setOnDragDropped, and I am trying to match them as closely to this example (http://docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm) as possible, which has worked for me before.

Edit 2: I have another project that currently has drag and drop events working with events very nearly identical to this, though with different objects - I have tried copying source from that project (and changing the variable names) with no luck. I can include that source as well, if it might help. But it is essentially the same.

What more can I include to help reach an answer?

解决方案

You need to accept the transfer mode in setOnDragOver, like this:

label.setOnDragOver(new EventHandler <DragEvent>() {

    public void handle(DragEvent event) {
        event.acceptTransferModes(TransferMode.ANY);
        event.consume();
    }
});

这篇关于JavaFX OnDragDropped不注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆