嘿,我想知道是否有可能创建一个程序,允许用户从硬盘驱动器(桌面,文档文件夹,视频文件夹)的任何地方拖动文件,并将其放入程序的窗口中。
我正在创建一个媒体播放器,我希望能够通过将MP4拖放到窗口中来播放视频。我是否需要将文件存储在变量中,还是仅将文件的位置存储到变量中。另外,保持对跨平台的支持也很重要。
我使用的是带有java7更新79jdk的JavaFx。
提前谢谢。
发布于 2015-09-16 08:29:27
下面是一个简单的拖放示例,它只设置文件名和位置。将文件拖到其中,它会显示文件的名称和位置。一旦您知道实际播放该文件应该是完全不同的事情。它主要取自甲骨文的文档:https://docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm
一个最小的实现需要两个EventHandler
集OnDragOver和OnDragDropped。
public class DragAndDropTest extends Application {
@Override
public void start(Stage primaryStage) {
Label label = new Label("Drag a file to me.");
Label dropped = new Label("");
VBox dragTarget = new VBox();
dragTarget.getChildren().addAll(label,dropped);
dragTarget.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (event.getGestureSource() != dragTarget
&& event.getDragboard().hasFiles()) {
/* allow for both copying and moving, whatever user chooses */
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
}
event.consume();
}
});
dragTarget.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasFiles()) {
dropped.setText(db.getFiles().toString());
success = true;
}
/* let the source know whether the string was successfully
* transferred and used */
event.setDropCompleted(success);
event.consume();
}
});
StackPane root = new StackPane();
root.getChildren().add(dragTarget);
Scene scene = new Scene(root, 500, 250);
primaryStage.setTitle("Drag Test");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
发布于 2018-06-19 03:10:46
在处理拖放事件时,您可以尝试以下操作:
获取DragEvent
的Dragboard
-object并使用getFiles
方法
private void handleDragDropped(DragEvent event){
Dragboard db = event.getDragboard();
File file = db.getFiles().get(0);
}
发布于 2021-11-25 14:22:23
我通过添加两个事件处理程序解决了这个问题。一个用于DragDropped
事件,另一个用于DragOver
事件。
例如:
@FXML
void handleFileOverEvent(DragEvent event)
{
Dragboard db = event.getDragboard();
if (db.hasFiles())
{
event.acceptTransferModes(TransferMode.COPY);
}
else
{
event.consume();
}
}
@FXML
void handleFileDroppedEvent(DragEvent event)
{
Dragboard db = event.getDragboard();
File file = db.getFiles().get(0);
handleSelectedFile(file);
}
否则它对我不起作用,将文件拖到我的面板上,不会触发任何事情。
https://stackoverflow.com/questions/32534113
复制相似问题