Openjfx GDK3 "Ошибка" с перетаскиванием - обходной путь?
С GTK3 Javafx, кажется, вызывает функцию GTK2, которая больше не действительна. Есть ли способ обойти это?
Для воспроизведения вы можете использовать стандартный debian(stretch) Mate destop с пакетом Openjdk 11 из бэкпортов вместе с openjfx 12-ea8 от maven. Другие установки показывают тот же эффект - но, думаю, эту настройку довольно легко воспроизвести.
public void test() {
AnchorPane anchorpane = new AnchorPane();
anchorpane.setOnDragDetected(event -> {
//test don'z care about mode
final Dragboard db = anchorpane.startDragAndDrop(TransferMode.COPY_OR_MOVE);
final ClipboardContent cc = new ClipboardContent();
cc.putString("somecontent");
SnapshotParameters snapshotParameters = new SnapshotParameters();
snapshotParameters.setViewport(new Rectangle2D(0, 0, 50,50));
db.setDragView(anchorpane.snapshot(snapshotParameters, null));
db.setContent(cc);
event.consume();
});
Stage test =new Stage();
test.setScene(new Scene(anchorpane));
test.show();
}
Если я запускаю его с параметром -Djdk.gtk.verbose=true, я получаю:
checking GTK version 3
trying GTK library libgtk-3.so.0
using GTK library version 3 set libgtk-3.so.0
Glass GTK library to load is glassgtk3
loaded gdk_x11_display_set_window_scale
И когда я делаю перетаскивание, это сообщение появляется, и dragview не показывается:
(java: 2946): GLib-GObject-WARNING **: /build/glib2.0-B1uXK /glib2.0-2.50.3/./gobject/gsignal.c:2523: сигнал 'expose-event' недопустим для экземпляр '0x7f63001f2a40' типа 'GtkWindow'
Теперь, если я запускаю его с параметром -Djdk.gtk.version=2 -Djdk.gtk.verbose=true
checking GTK version 2
trying GTK library libgtk-x11-2.0.so.0
using GTK library version 2 set libgtk-x11-2.0.so.0
Glass GTK library to load is glassgtk2
Теперь против gtk2 etherything работает безупречно: Dragview отображается без ошибок.
Похоже, что он правильно обнаруживает gtk3 (хорошо!), Но затем все еще использует вызовы gtk2 против библиотеки gtk3, которые терпят неудачу.
Есть ли обходной путь, например, как-то воссоздать dragview или установить вместо него Popup как dragview или как-то так, чтобы он работал на рабочих столах пользователей без особых требований к ним?