Javafx:如何使用Dialog修复拖放干扰

时间:2016-06-21 16:20:05

标签: java javafx drag-and-drop paste

在我的应用程序中,用户可以将某些自定义格式从某个列表拖到GridPane。在某些特殊情况下,我还需要用户提供一些其他信息,因此我需要打开TextInputDialog。代码的(强)简化版本看起来像:

setOnDragDropped(event -> {
    Dragboard db = event.getDragboard();
    // ... handle object in DragBoard
    event.setDropCompleted(true);
    event.consume();
    String text = new TextInputDialog().showAndWait().get();
}

检索用户输入的值没有问题,但我注意到的一个奇怪的事情是用户无法将文本粘贴到TextInputDialog。既不是按Strg + V,也不是使用右键单击 - >粘贴(选项显示为灰色)。这可能听起来像一个小问题,但在这个用例中,用户会想要经常粘贴文本。

仅当我将自定义数据放入ClipboardContent时才会发生这种情况,而当我在其中放置String时,不是。在setOnDragDone(...)内调用Dialog时,情况似乎就是这样。

那么有没有办法打开TextInputDialog以响应拖动事件并仍能粘贴文字?

这是一个完整的应用程序,可以重现这个问题:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextInputDialog;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage stage) throws Exception{
        DataFormat format = new DataFormat("some format");
        GridPane pane = new GridPane();
        Label dragMeLabel = new Label("drag me");
        Label dropHereLabel = new Label("drop here");
        dragMeLabel.setOnDragDetected(event -> {
            Dragboard db = dragMeLabel.startDragAndDrop(TransferMode.ANY);
            ClipboardContent cc = new ClipboardContent();
            cc.put(format, "foo bar");
            db.setContent(cc);
        });
        dropHereLabel.setOnDragOver(event -> event.acceptTransferModes(TransferMode.COPY));
        dropHereLabel.setOnDragDropped(event -> {
            event.setDropCompleted(true);
            event.consume();
            String text = new TextInputDialog().showAndWait().get();
            //can't past text into this Dialog
        });
        pane.add(dragMeLabel, 0, 0);
        pane.add(dropHereLabel, 1, 0);

        pane.setAlignment(Pos.CENTER);
        pane.setHgap(10);
        pane.setVgap(10);
        pane.setPadding(new Insets(25, 25, 25, 25));

        stage.setScene(new Scene(pane, 200, 50));
        stage.show();
    }

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

0 个答案:

没有答案