JavaFX应用程序中.jar文件的拖放功能问题

5ssjco0h  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(149)

JavaFX应用程序中的拖放功能问题
我目前正在开发一个JavaFX应用程序,并试图实现拖放功能。我在我的UI中有一个窗格,我希望用户能够拖放文件,特别是.jar文件。然而,我遇到了一个问题,当我在窗格上拖动文件时,光标显示取消符号,并且没有触发放置事件。
我尝试了各种方法,包括为窗格设置onDragEntered、onDragExited、onDragOver和onDragDropped事件处理程序。我还将TransferMode设置为COPY,并验证拖动板是否有文件。但是,所需的行为没有按预期工作。
下面是我的FXML文件:

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

<?import java.net.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.detector.Controller">
    <stylesheets>
        <URL value="@styles.css" />
    </stylesheets>
    <children>
        <Pane fx:id="dragDropPane" layoutY="-3.0" prefHeight="349.0" prefWidth="600.0" />
        <Button layoutX="545.0" layoutY="361.0" onAction="#onOpenButtonClick" text="Open" />
        <TextField fx:id="pathText" layoutX="14.0" layoutY="361.0" prefHeight="25.0" prefWidth="515.0" />
      <Label layoutX="255.0" layoutY="192.0" text="Drag .jar file here" />
    </children>
</AnchorPane>

下面是我的控制器代码:

import javafx.fxml.FXML;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.Pane;

import java.io.File;

public class Controller {
    @FXML
    public Pane dragDropPane;

    @FXML
    public void initialize() {
        dragDropPane.setOnDragEntered(event -> {
            if (event.getGestureSource() != dragDropPane && event.getDragboard().hasFiles()) {
                dragDropPane.setStyle("-fx-border-color: blue; -fx-border-width: 2;");
                event.acceptTransferModes(TransferMode.COPY);
            }
            event.consume();
        });

        dragDropPane.setOnDragExited(event -> {
            dragDropPane.setStyle("-fx-border-color: transparent;");
            event.consume();
        });

        dragDropPane.setOnDragOver(event -> {
            if (event.getGestureSource() != dragDropPane && event.getDragboard().hasFiles()) {
                event.acceptTransferModes(TransferMode.COPY);
            }
            event.consume();
        });

        dragDropPane.setOnDragDropped(event -> {
            Dragboard dragboard = event.getDragboard();
            boolean success = false;
            if (dragboard.hasFiles()) {
                for (File file : dragboard.getFiles()) {
                    // Process the dropped file
                    System.out.println("Dropped file: " + file.getAbsolutePath());
                }
                success = true;
            }
            event.setDropCompleted(success);
            event.consume();
        });
    }
}

我不确定为什么拖放功能不像预期的那样工作。我感谢任何关于如何解决这个问题的见解或建议。谢谢大家!

bqujaahr

bqujaahr1#

我将初始化方法的内容复制到一个新应用程序的开始方法中,并添加了允许它显示和运行的位,它对我来说没有任何问题。(Win 11上的JavaFX和JDK 20)。
我从文件资源管理器中将文件拖放到应用程序窗口中,它们在系统中被命名为out,根据drop处理程序代码。

  • 输出 *
javafx.scene.input.DragEvent[source=Pane@6b2cc6e[styleClass=root]]
Dropped file: C:\Users\<username>\OneDrive\Documents\flight.txt
  • 密码 *
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

import java.io.File;

public class CopyHandler extends Application {

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

    @Override
    public void start(Stage primaryStage) {
        Pane dropPane = new Pane();
        dropPane.setPrefSize(600, 400);

        dropPane.setOnDragEntered(event -> {
            System.out.println(event);

            if (event.getGestureSource() != dropPane && event.getDragboard().hasFiles()) {
                dropPane.setStyle("-fx-border-color: blue; -fx-border-width: 2;");
                event.acceptTransferModes(TransferMode.COPY);
            }
            event.consume();
        });

        dropPane.setOnDragExited(event -> {
            dropPane.setStyle("-fx-border-color: transparent;");
            event.consume();
        });

        dropPane.setOnDragOver(event -> {
            if (event.getGestureSource() != dropPane && event.getDragboard().hasFiles()) {
                event.acceptTransferModes(TransferMode.COPY);
            }
            event.consume();
        });

        dropPane.setOnDragDropped(event -> {
            Dragboard dragboard = event.getDragboard();
            boolean success = false;
            if (dragboard.hasFiles()) {
                for (File file : dragboard.getFiles()) {
                    // Process the dropped file
                    System.out.println("Dropped file: " + file.getAbsolutePath());
                }
                success = true;
            }
            event.setDropCompleted(success);
            event.consume();
        });

        primaryStage.setScene(new Scene(dropPane));
        primaryStage.show();
    }
}

相关问题