我正在尝试一个简单的Java FX程序,它可以创建一个窗口,我所需要的只是增加读取已删除文件的能力。我得到了以下代码片段,它不会抛出任何错误,但也不允许我删除任何内容。当我试图删除文件时,它会显示一个红色光标(不允许使用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的代码。(无法拖放到Eclipse)
现在我有了一个可行的解决方案,希望你也能这么做。我已经更改了您要求的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布局编写一个九人莫里斯游戏,我将使用场景生成器进行图形部分。 谁能给我写一个关于拖放的小例子吗?因为这是一场九人莫里斯的比赛,我只喜欢拖拽,并有一些我可以扔下碎片的点。
我有一扇没有装饰的窗户: 我想知道我怎样才能把它做成一扇可拖动的未装饰窗户?我想在用户用鼠标右键选择窗口时更改其位置,然后在按住鼠标键的同时移动鼠标。 附言:我测试了这个解决方案,但它不起作用: