从资源管理器在ListView上拖放JavaFX

从资源管理器在ListView上拖放JavaFX,java,listview,javafx,drag-and-drop,drag,Java,Listview,Javafx,Drag And Drop,Drag,我试图通过简单地将文件夹从资源管理器拖到我的ListView来实现在我的程序中添加文件夹路径的功能 ListView的类型为字符串: 在控制器类中: public class Controller { @FXML protected ListView<String> folderList; protected void init(){ folderList.setOnDragOver(new

我试图通过简单地将文件夹从资源管理器拖到我的ListView来实现在我的程序中添加文件夹路径的功能

ListView的类型为字符串:

在控制器类中:

    public class Controller {
  @FXML
        protected ListView<String> folderList;
        protected void init(){
        
                folderList.setOnDragOver(new EventHandler<DragEvent>() {
        
                    @Override
                    public void handle(DragEvent event) {
                        System.out.println("test");
        
                        if (event.getGestureSource() != folderList) {
                            event.acceptTransferModes(TransferMode.ANY);
                        }
                        event.consume();
                    }
                });
                
                folderList.setOnDragDropped(new EventHandler<DragEvent>() {
        
                    @Override
                    public void handle(DragEvent event) {
                        Dragboard db = event.getDragboard();
                        boolean succ = false;
                        System.out.println(db);
        
                        try {
                            doFolderAdd(new Folder(db.getString()));
                            succ = true;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
        
                        event.setDropCompleted(succ);
                        event.consume();
                    }
                });
        }
    }
相应的FXML:

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

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onDragOver="" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #4c4c4c;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.makery.address.model.Controller">
    <children>
      <ListView id="testList" fx:id="list" layoutX="55.0" layoutY="58.0" prefHeight="200.0" prefWidth="200.0" />
    </children>
</Pane>

我甚至无法测试添加路径的逻辑是否正常工作,因为当我将项目从windows资源管理器窗口拖到列表上时,这些事件都不会触发

我注意到,如果我从程序中打开一个FileChooser,并将其中的一个项目拖到列表中,事件确实会被触发,但这是唯一的情况。我找不到关于这个问题的任何信息

从资源管理器窗口拖动时,它只显示“拒绝/阻止”图标

我找到了一个修复程序

所描述的行为是从IDE(Eclipse)运行程序时的情况


然而,在将其导出为JAR并尝试拖放之后,它确实可以工作。我不知道如何在IDE内部解决这个问题。

您提到了以下几点:

  • 该问题仅在从Eclipse启动JavaFX应用程序时发生
  • 您正在以管理员权限运行Eclipse
  • 您可以将东西从Eclipse拖到JavaFX应用程序
有了这些信息,您很可能会遇到上所述的问题。以下是公认答案的摘录:

你可以看到一个效果。仅适用于具有相同权限级别的程序。如果以管理员身份运行应用程序,则只能从同样以管理员身份运行的应用程序中拖放文件

用户界面特权隔离(UIPI)

UIPI阻止Windows消息从MIC级别较低的进程发送到MIC级别较高的进程。拖放是通过Windows消息实现的。因此,如果您尝试将文件从Windows资源管理器(中麦克风)拖放到运行提升(高麦克风)的记事本,Windows消息将被阻止,拖放无法工作


由于Eclipse具有管理员权限,所以JavaFX应用程序也具有管理员权限。文件资源管理器至少不能以管理员权限运行,这就是您的问题所在。解决方案是要么让File Explorer以管理员权限运行,要么不以管理员权限运行Eclipse,要么在开发过程中简单地“忍受”这个问题(或者找到一种方法确保JavaFX应用程序不继承管理员状态)。

。发生这种情况的原因有很多,如果没有代码进行测试,每个人都只是猜测。我添加了它,删除我的自定义单元格工厂也没有改变任何事情。请阅读参考的帮助页面并按照此操作。嗯?我不明白你在使用什么操作系统?你是以管理员权限运行Eclipse吗?是的,我是,因为这是我的注册表读取器所要求的。然后我相信你会遇到这样的情况:哦,该死,这很有意义,谢谢:3但是,这给我带来了另一个问题……因为我的程序需要以管理员身份运行,默认情况下,资源管理器不是以管理员身份运行的,没有用户能够使用拖放功能。可能有一种方法可以完成您想要的操作。我不是UAC方面的专家,所以即使有,我也不知道。好了,是时候发布一个新的问题了!
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onDragOver="" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #4c4c4c;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.makery.address.model.Controller">
    <children>
      <ListView id="testList" fx:id="list" layoutX="55.0" layoutY="58.0" prefHeight="200.0" prefWidth="200.0" />
    </children>
</Pane>