После перетаскивания JavaFX мне нужно дважды щелкнуть, чтобы закрыть окно - PullRequest
0 голосов
/ 13 апреля 2020

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

Однако, в следующих случаях все работает нормально:

  • Использование метки вместо текстового поля (но проблема остается с текстовой областью)
  • Перетаскивание строки в текстовое поле из другого приложения
  • Перетаскивание строки из ячейки списка в другое приложение

Нажатие в любом месте окно также «освобождает» кнопку закрытия - даже вне списка или текстового поля.

Отредактировано : ниже приведен минимальный рабочий пример (класс DnD в пакете dnd). Обратите особое внимание на обработчики перетаскивания, используемые в поле и в ячейке списка. Чтобы воспроизвести проблему: запустите программу, перетащите Banana из списка в текстовое поле и затем попытайтесь закрыть окно. В моем случае я должен щелкнуть дважды.

package dnd;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Dnd extends Application {

    @Override
    public void start(Stage stage) {
        stage.setScene(new Scene(new DndPanel(), 200, 300));
        stage.setTitle("Drag and drop");
        stage.setResizable(false);
        stage.show();
    }

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

    public static class DndPanel extends VBox {

        public DndPanel() {
            super(10);
            TextField field = new TextField();
            ListView<String> list = new ListView<>();
            list.setCellFactory(Dnd.DnDCell::new);
            list.getItems().addAll("Apple", "Pear", "Banana", "Grapes", "Peach", "Pineapple");
            setPadding(new Insets(10));
            getChildren().addAll(field, list);

            field.setOnDragOver(ev -> {
                if (ev.getDragboard().hasString()) {
                    ev.acceptTransferModes(TransferMode.COPY);
                }
                ev.consume();
            });

            field.setOnDragDropped(ev -> {
                field.setText(ev.getDragboard().getString());
                ev.setDropCompleted(true);
                ev.consume();
            });

        }

    }

    public static class DnDCell extends TextFieldListCell<String> {
        public DnDCell(ListView<String> listView) {
            setOnDragDetected(ev -> {
                Dragboard dragboard = startDragAndDrop(TransferMode.COPY);
                ClipboardContent cc = new ClipboardContent();
                cc.putString(listView.getItems().get(getIndex()));
                dragboard.setContent(cc);
                ev.consume();
            });
        }
    }
}

Протестировано на JavaFX 11.0.2 из Gluon на Ubuntu Linux 18.04 с дополнительной опцией времени выполнения JVM -Djdk.gtk.version=2.

...