JavaFX拖放窗口没有响应

时间:2015-09-23 16:02:42

标签: java javafx

我正在尝试一个简单的Java FX程序来创建一个Window,我只需要添加读取删除文件的能力。我有以下代码片段,它不会抛出任何错误,但我也不会放弃任何错误。当我尝试删除文件时,它显示一个红色光标(不允许使用Windows光标)

我使用的是Windows 8计算机和JDK版本8.0_60。不确定是什么问题。代码有问题吗?我错过了什么吗?

我尝试了什么 -

  1. 尝试更改传输模式
  2. 尝试检查文件权限
  3. 很抱歉,如果代码中存在一个愚蠢的错误,因为我是JavaFx的新手。

    这是代码 -

    import javafx.application.Application;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.input.*;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class DragMe extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            Label label = new Label("Please Drag Your File Here.");
            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().hasString()) {
                        /* allow for both copying and moving, whatever user chooses */
                        event.acceptTransferModes(TransferMode.ANY);
                    }
                    event.consume();
                }
            });
    
            dragTarget.setOnDragDropped(new EventHandler<DragEvent>() {
    
                @Override
                public void handle(DragEvent event) {
                    Dragboard db = event.getDragboard();
                    boolean success = false;
                    if (db.hasString()) {
                        dropped.setText(db.getString());
                        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("Testing the Drap File");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    更新

    与NwDx进行过讨论,我们试图找出不同情况下的拖放。

    1. 如果从Eclipse文件树拖动文件,则允许删除
    2. 如果文件是从任何其他位置拖动的,例如桌面,它不起作用
    3. 尝试为eclipse创建一个新的工作区,但没有工作。
    4. 在MS Word中尝试拖放,效果很好。
    5. 尝试创建一个JAR并运行它,它运行正常。
    6. 尝试以管理员身份启动Eclipse,但没有运气。

      解决

      以管理员身份运行Eclipse会导致此问题。正常运行有效!感谢NwDx为您的代码。 (Unable to drag and drop to Eclipse

2 个答案:

答案 0 :(得分:1)

现在我已经找到了解决方案,希望对你也有帮助。我已经更改了您要求setOnDragOver的方式,也许文件没有hasString()为真,所以我将其更改为event.getDragboard().hasFiles()并将Transfertype更改为Copy。但是你可以像你想要的那样改变它。之后你需要从Dragboard获取文件(你可能已经拖了多个)。在我的简单示例中,我只抓住第一个并显示它的绝对路径。

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.*;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class DragMe extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Please Drag Your File Here.");
        Label dropped = new Label("");
        Label content = new Label();
        VBox dragTarget = new VBox();
        dragTarget.getChildren().addAll(label, dropped, content);
        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);
                }
                event.consume();
            }
        });

        dragTarget.setOnDragDropped(new EventHandler<DragEvent>() {

            @Override
            public void handle(DragEvent event) {
                Dragboard db = event.getDragboard();
                List<File> files = (ArrayList<File>) db.getContent(DataFormat.FILES);

                boolean success = false;
                if (files != null) {
                    File file = files.get(0);
                    dropped.setText(file.getAbsolutePath());
                    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("Testing the Drap File");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

App

答案 1 :(得分:0)

要添加到NwDx答案,如果以管理员身份运行Eclipse,那么拖放工作将无法正常工作。

正常运行并让它正常工作!

参考 - Unable to drag and drop to Eclipse