当前位置: 首页 > 知识库问答 >
问题:

JavaFX拖放窗口无响应

胡景焕
2023-03-14

我正在尝试一个简单的Java FX程序,它可以创建一个窗口,我所需要的只是增加读取已删除文件的能力。我得到了以下代码片段,它不会抛出任何错误,但也不允许我删除任何内容。当我试图删除文件时,它会显示一个红色光标(不允许使用windows光标)

我使用的是Windows 8机器和JDK 8.0_60版。不确定问题出在哪里。代码有问题吗?我错过什么了吗?

我试过的-

  1. 已尝试更改传输模式
  2. 尝试检查文件权限

抱歉,如果代码中有一个愚蠢的错误,因为我是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文件树中拖动的,则允许拖放

尝试以管理员身份启动Eclipse,但没有成功。

解决了

以管理员身份运行Eclipse会导致此问题。运行正常!感谢NwDx的代码。(无法拖放到Eclipse)

共有2个答案

关志
2023-03-14

添加到NwDx应答,如果以管理员身份运行Eclipse,则拖放将不起作用。

正常运行并使其正常工作!

参考-无法拖放到Eclipse

东门胤
2023-03-14

现在我有了一个可行的解决方案,希望你也能这么做。我已经更改了您要求的setOnDragOver的方式,可能一个文件没有hastring()为true,所以我将其更改为事件。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);
    }
}
 类似资料:
  • 我一直在尝试在JavaFX中实现节点拖动,我遇到了一个似乎应该相对容易解决的问题。我猜这与调整窗口大小后JavaFX场景图如何更新(或不更新)有关。 无论如何,问题如下: 应用程序在一个小窗口中启动,其中有一个节点可以在窗口中单击和拖动。这在两种情况下都可以正常工作: 在调整大小之前,单击并在窗口中拖动节点。 调整大小后,单击节点并在窗口中拖动。 但在第三种情况下失败: 拖动事件似乎无法识别窗口边

  • 我正在处理一个应用程序,它以透明的锚窗格开始(没有标题栏和圆角)。我想要能够拖动和移动窗口周围。我已经让它工作了,但是当我点击它时,窗口会向上弹到你从中心拖动的地方,而不是你点击的地方。 CSS: main.java: 控制器: 我有一种感觉,我需要说明光标在哪里,但我不确定如何。我是正确的还是我遗漏了一些更容易的东西?

  • 我已经在我的游戏中实现了拖放功能,但到目前为止,我只能“拖放”到硬编码的位置。如图所示: 我想要的是: 当船舶被丢弃时,它的x、y值(相对于GridPane)被保存,或者 飞船掉落到的细胞被保存。 我的setOnDragDropped事件在此处处理: 我觉得这应该是一个简单的鼠标悬停事件或类似的事情,但我不知道该怎么做。 编辑:下面类的完整代码: }

  • 我在网格窗格中用两个ImageView做拖放测试。我的问题是,当我完成拖放并将目标imageview移动到源imageview并释放鼠标时,我错误地以显示“img2”中的图片而不是“img1”中的图片结束。当我注释掉“setOnDragExited”方法时,我最终得到了正确的图像“img1”,任何建议都将不胜感激。

  • 我喜欢用Javafx和FXML布局编写一个九人莫里斯游戏,我将使用场景生成器进行图形部分。 谁能给我写一个关于拖放的小例子吗?因为这是一场九人莫里斯的比赛,我只喜欢拖拽,并有一些我可以扔下碎片的点。

  • 我有一扇没有装饰的窗户: 我想知道我怎样才能把它做成一扇可拖动的未装饰窗户?我想在用户用鼠标右键选择窗口时更改其位置,然后在按住鼠标键的同时移动鼠标。 附言:我测试了这个解决方案,但它不起作用: