Перетащите функциональность с VBox - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь добавить функциональность перетаскивания для моего проекта JavaFX. Это вроде работает, но не совсем одновременно

VBox questions = new VBox();
questions.getChildren().add(createQustionType("long answer"));
questions.setStyle("-fx-border-color: blue;");
root.setCenter(questions);
questions.setOnDragOver(event ->
{
    event.acceptTransferModes(TransferMode.MOVE);
});
questions.setOnDragDropped(event ->
{
    event.setDropCompleted(true);
    questions.getChildren().add(createQustionType("long answer"));
    event.consume();
});

questions.setOnDragDone(event -> {});
VBox sidePanel = new VBox();
root.setLeft(sidePanel);
//other unnecessary code removed for question

String[] types = new String[]{"multiple choice", "long answer", "short answer"};
for (String type : types)
{
    Button btn = new Button(type);
    btn.setOnDragDetected(event ->
    {
        currBtn = (Button) event.getSource();
        event.consume();
    });
    sidePanel.getChildren().add(btn);}

метод createQuestionType возвращает граничную панель и принимает один параметр строки

Это то, что я имею до сих пор, и я не знаю, где я иду не так, потому что, кажется, это работает, когда я перетаскиваю файл со своего рабочего стола или документов и т. Д., Что я не хочу, чтобы это делалось. Я хочу использовать кнопки, добавленные на боковую панель, для этого она предназначена.

Кроме того, я пытался изменить курсор при перетаскивании, но тоже не получилось. Если бы кто-то мог показать мне, что я делаю неправильно, это было бы здорово.

1 Ответ

0 голосов
/ 11 июля 2019

Прошу прощения за тех, кто не совсем понял мой вопрос.Я постараюсь сформулировать свои вопросы лучше в следующий раз.В любом случае мне удалось решить мою проблему.Я понял, что должен использовать DragBoard и ClipboardContent Вот окончательный код, который я придумал

VBox questions = new VBox();
root.setCenter(questions);
questions.setOnDragOver(event ->
{
    if (event.getGestureSource() == currBtn && event.getDragboard().hasString())
    {
        event.acceptTransferModes(TransferMode.MOVE);
    }
    event.consume();
});
questions.setOnDragDropped(event ->
{
    Dragboard db = event.getDragboard();
    boolean success = false;
    if (db.hasString())
    {
        questions.getChildren().add(createQustionType(db.getString()));
        success = true;
    }
    event.setDropCompleted(success);
    event.consume();
});

questions.setOnDragDone(event ->
{
    System.out.println("Add clean up code");
    if (event.getTransferMode() == TransferMode.MOVE)
    {
        System.out.println("Drag Done");
    }
    event.consume();
});

VBox sidePanel = new VBox();
root.setLeft(sidePanel);
sidePanel.setMinWidth(100);
//sidePanel.setStyle("-fx-background-color: red");
sidePanel.setStyle("-fx-border-color: red; -fx-min-width: 100px;");
sidePanel.setSpacing(10);

String[] types = new String[]{"multiple choice", "long answer", "short answer"};
for (String type : types)
{
    Button btn = new Button(type);
    btn.getStyleClass().add("qBtn");
    btn.setStyle("-fx-border-color: black;");
    btn.setOnDragDetected(event ->
    {
        currBtn = (Button) event.getSource();
        System.out.println("Dragging node");
        Dragboard db = btn.startDragAndDrop(TransferMode.ANY);
        ClipboardContent content = new ClipboardContent();
        content.putString(btn.getText());
        db.setContent(content);

        event.consume();
    });
    sidePanel.getChildren().add(btn);
}
...