我正在尝试一个简单的Java FX程序来创建一个Window,我只需要添加读取删除文件的能力。我有以下代码片段,它不会抛出任何错误,但我也不会放弃任何错误。当我尝试删除文件时,它显示一个红色光标(不允许使用Windows光标)
我使用的是Windows 8计算机和JDK版本8.0_60。不确定是什么问题。代码有问题吗?我错过了什么吗?
我尝试了什么 -
很抱歉,如果代码中存在一个愚蠢的错误,因为我是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进行过讨论,我们试图找出不同情况下的拖放。
尝试以管理员身份启动Eclipse,但没有运气。
解决
以管理员身份运行Eclipse会导致此问题。正常运行有效!感谢NwDx为您的代码。 (Unable to drag and drop to Eclipse)
答案 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);
}
}
答案 1 :(得分:0)