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();
});
}
}
我不确定为什么拖放功能不像预期的那样工作。我感谢任何关于如何解决这个问题的见解或建议。谢谢大家!
1条答案
按热度按时间bqujaahr1#
我将初始化方法的内容复制到一个新应用程序的开始方法中,并添加了允许它显示和运行的位,它对我来说没有任何问题。(Win 11上的JavaFX和JDK 20)。
我从文件资源管理器中将文件拖放到应用程序窗口中,它们在系统中被命名为out,根据drop处理程序代码。