在执行拖放操作时,我需要知道某个键是否按下。
因此,我尝试将场景的setOnKeyPressed
/ setOnKeyReleased
与HashMap结合使用,但是这种方法存在问题:
想象一下一个场景,在按住Control的同时将TableView项拖放到某个位置。现在,如果我在下拉菜单的最后显示一个对话框,同时仍然按住Control键,则不会使用这种方法调用setOnKeyReleased
...因为Dialog是接收密钥的对话框已发布事件。
我该如何解决?
答案 0 :(得分:1)
希望我理解您的问题,这里是一个可能的解决方案(使用任何键):
public class Main extends Application {
SimpleBooleanProperty isKeyPress = new SimpleBooleanProperty(false);
@Override
public void start(Stage primaryStage) throws Exception{
Parent window = new VBox();
((VBox) window).getChildren().add(new Label("example of small window:"));
primaryStage.setTitle("example");
Scene scene=new Scene(window);
primaryStage.setScene(scene);
primaryStage.show();
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("Press");
isKeyPress.set(true);
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Information Dialog");
alert.setHeaderText(null);
alert.setContentText("I have a great message for you!");
Scene alertScene = alert.getDialogPane().getScene();
alertScene.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("Released on dialog");
isKeyPress.set(false);
}
});
alert.showAndWait();
}
});
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("Released");
isKeyPress.set(false);
}
});
}
public static void main(String[] args) {
launch(args);
}
}
输出示例:
Press
Released on dialog
答案 1 :(得分:1)
从your comment开始,目标是根据 Ctrl 是否按下来更改拖放行为。在进行复制操作时,否则进行移动操作。您无需处理KeyEvent
即可实现此行为。相反,您将确定是复制还是在onDragDetected
处理程序中移动。 onDragDetected
处理程序使用MouseEvent
,它具有查询修饰键状态的方法,例如isControlDown()
。使用此功能,我们可以基于修改键指定允许的传输模式。
Node node = ...;
node.setOnDragDetected(event -> {
Dragboard board;
if (event.isControlDown()) {
board = node.startDragAndDrop(TransferMode.COPY);
} else {
board = node.startDragAndDrop(TransferMode.MOVE);
}
// add contents to Dragboard
});
请注意,使用isShortcutDown()
可能会更跨平台。