Проблемы с прокруткой с сенсорным экраном и openjfx в Linux с использованием GTK

#java #javafx #javafx-8 #gtk3 #gtk2

#java #javafx #javafx-8 #gtk3 #gtk2

Вопрос:

В настоящее время я работаю над приложением типа киоска, ориентированным на сенсорный экран, со списком видео. Пользователь перейдет к видео, которое он хочет просмотреть, используя сенсорный экран, и нажмите на него, чтобы просмотреть его. Я запускаю это на intel NUC с установленным Ubuntu 20.04 LTS. Это информация о lsusb сенсорного экрана:

 Bus 001 Device 018: ID 2575:0401 Weida Hi-Tech                CoolTouchR System
  

Я пишу это приложение на java / javafx, потому что это то, с чем мне удобнее всего.

Когда я использую GTK3 (по умолчанию), приложение не реагирует ни на какие события сенсорного экрана, которые я нашел здесь, которые я могу использовать -Djdk.gtk.version=2 , чтобы заставить java использовать GTK2. Это работает для обычных сенсорных входов, но когда я начинаю прокручивать экран, экран возвращается назад, после того, как пользователь перемещает палец, не касаясь экрана, для прокрутки дальше, чем позволяет экран. Это происходит только в Linux в приложениях JavaFX. Приложения GTK, такие как Ubuntu applications store, не должны вызывать проблем.

Вы можете видеть, как это происходит в этом gif, который я записал. Следите за полосой прокрутки / числами, когда я начинаю перетаскивать снизу вниз. Ссылка Gif

Я пробовал использовать разные версии java / javafx:

  • Oracle JDK 8
  • OpenJDK 8
  • OpenJDK 11 Gluon OpenJFX 11 (также пробовал v15)
  • Liberica OpenJRE 8 полная

Все они вызывали одинаковые проблемы с GTK2 / GTK3

Код для воспроизведения этой ошибки выглядит следующим образом:

 public class App extends Application {
    public void start(Stage stage) throws Exception {
        VBox vBox = new VBox();

        for (int i = 0; i < 1000; i  ) {
            vBox.getChildren().add(new Label("Label: " i));
        }
        ScrollPane scrollPane = new ScrollPane(vBox);
        scrollPane.setPannable(true);

        stage.setScene(new Scene(scrollPane));
        stage.show();
    }
}
  

Я еще не смог найти исправление, кто-нибудь еще сталкивался с этим раньше? Кто-нибудь знает, как это исправить? Спасибо

Комментарии:

1. Используйте ListView . Вероятно, у вас их слишком много Nodes , и они убивают всю вашу память.

2. Если посмотреть на предоставленную вами ссылку, есть вероятность, что это ошибка, которая не была исправлена.

3. @Sedrick Я просто создаю множество узлов, чтобы прокручивать контент, я не так запрограммировал его в реальной реализации. Ошибка ведет себя точно так же.