在我的应用程序中,用户可以将某些自定义格式从某个列表拖到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);
}
}