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

JavaFX Drag and Drop on ListView from Explorer

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

ListView 是字符串类型:

在控制器中class:

    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();
                    }
                });
        }
    }

我的主要class:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException, InterruptedException, WriterException {


        FXMLLoader loader = new FXMLLoader(getClass().getResource("/ch/makery/address/view/App.fxml"));

        Parent root = (Parent) loader.load();

        ctrl = loader.getController();
        ctrl.init();
        Scene scene = new Scene(root, 600, 400);
        primaryStage.setTitle("test");
        primaryStage.setScene(scene);
        ctrl.setStage(primaryStage);
        primaryStage.show();

    }



    public static void main(String[] args) {
        launch(args);
    }
}

对应的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 资源管理器 window 拖动到列表。

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

从资源管理器 window 拖动时,它只显示 'denied/blocked' 图标

我好像找到了解决方法。

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

但是,将其导出为 JAR 并尝试拖放后,它确实有效。我不知道如何在 IDE.

中解决这个问题

您提到了以下内容:

  • 只有从 Eclipse 启动 JavaFX 应用程序时才会出现此问题。
  • 您正在 运行宁 Eclipse 具有管理员权限。
  • 您可以将内容从 Eclipse 拖到 JavaFX 应用程序。

根据这些信息,您很可能 运行 正在解决 Why doesn't usual Drag&Drop work in Windows 10? on Super User 中描述的问题。以下是已接受答案的摘录:

You see a effect of the User Account Control. Drag & Drop only works for programs that have the same permission level. If you run an application as admin, you can only drag and drop files from applications that also run as admin.

User Interface Privilege Isolation (UIPI)

UIPI blocks Windows messages being sent from process with a lower MIC level to one running at a higher MIC level. Drag-and-drop is implemented via Windows messages. Therefore, if you try and drag-and-drop a file from Windows Explorer (medium MIC) to Notepad running elevated (high MIC), the Windows messages are blocked and drag-and-drop doesn’t work.

由于 Eclipse 具有管理员权限,因此您的 JavaFX 应用程序也具有管理员权限。 文件资源管理器 没有 运行 管理员权限,至少 not by default,因此你的问题。解决方案是使 File Explorer 运行 具有管理员权限,不要 运行 Eclipse 具有上述权限,或者在开发过程中简单地“解决”这个问题(或者找到一种方法来确保 JavaFX 应用程序不继承管理状态)。