Проблемы с сенсорным вводом и OpenJDK 11 с JavaFX 11 - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над проектом JavaFX и хотел бы перейти с Oracle JDK 1.8 на OpenJDK 11. Пока что переход был довольно плавным, но есть еще одна основная проблема, связанная с вводом с помощью сенсорного ввода / мыши, которая вызывает некоторые проблемы,

Пользовательский интерфейс JavaFX должен работать на устройстве с сенсорным экраном, которое раньше работало прямо из коробки с Oracle JDK 1.8.Когда я касаюсь экрана, запускается следующая последовательность событий мыши, как и ожидалось:

MOUSE_PRESSED

MOUSE_RELEASED

MOUSE_CLICKED

После создания того же приложения с OpenJDK11 (с использованием OpenJFX 11 в качестве внешней библиотеки, поскольку JavaFX по умолчанию больше не является частью JDK), я получаю следующую последовательность событий:

MOUSE_ENTERED_TARGET

MOUSE_ENTERED_TARGET

MOUSE_EXITED_TARGET

MOUSE_EXITED_TARGET

Это объясняет, почему я не могу нажимать какие-либо кнопки (или элементы управления в целом).Все идет нормально.Вопрос в том, как мне вернуть мои MOUSE_{PRESSED,RELEASED,CLICKED} события?

SSCE:

package com.example.jfxtouchtest;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TouchEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;


public class JFXTouchTest {

    public static void main(String[] args) {
        Application.launch(JFXApp.class, args);
    }

    public static class JFXApp extends Application {
        @Override
        public void start(Stage primaryStage) {
            primaryStage.addEventFilter(TouchEvent.ANY, e -> System.out.println("touch event: " + e.getEventType()));
            primaryStage.addEventFilter(MouseEvent.ANY, e -> System.out.println("mouse event: " + e.getEventType()));
            primaryStage.setScene(new Scene(new Pane()));
            primaryStage.setWidth(800);
            primaryStage.setHeight(600);
            primaryStage.show();
        }
    }
}

Я думаю, что стоит отметить, что все запущенные события MouseEvents (не TouchEvents)), независимо от того, использую ли я сенсорный экран или нет.Это само по себе странно, на мой взгляд, но по крайней мере я получаю желаемое поведение с JDK 8 ...

Некоторая справочная информация:

  • ОС: Ubuntu 18.04.01 LTS
  • Ядро: 4.15.0-42-generic
  • Oracle JDK 1.8.0_191
  • OpenJDK 11.0.1
  • Сенсорный экран (как сообщаетxinput): Atmel maXTouch Digitizer
  • Сенсорный экран отлично работает с другими приложениями, события нажатия, похоже, обрабатываются должным образом.
  • VM-аргументы, связанные с somehwat

    -Dcom.sun.javafx.isEmbedded=true и

    -Dcom.sun.javafx.touch=true

    оба, похоже, не влияют на проблему

  • Кажется, есть небольшая разницав выводе xev, который я получаю в зависимости от того, использую ли я мышь или сенсорный экран:

    Mouse (state is 0x0 для ButtonPress, 0x100 для ButtonRelease):

    ButtonPress event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 16982696, (93,90), root:(964,612),
        state 0x0, button 1, same_screen YES
    
    ButtonRelease event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 16983364, (93,90), root:(964,612),
        state 0x100, button 1, same_screen YES
    

    Сенсорный экран (state - 0x100 в обоих случаях):

    ButtonPress event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 17599475, (93,145), root:(964,667),
        state 0x100, button 1, same_screen YES
    
    ButtonRelease event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 17599537, (93,145), root:(964,667),
        state 0x100, button 1, same_screen YES
    

    Хотя я не совсем уверен, что это значит.

Любая помощь будет принята с благодарностью, даже если это всего лишь подтверждение того, что проблема воспроизводима на другом компьютере с сенсорным экраном другого типа!Заранее большое спасибо!

ОБНОВЛЕНИЕ: Тем временем мне удалось заполучить другой сенсорный экран, и, похоже, с ним все в порядке.Интересно то, что, как и в случае с обычными событиями мыши, xev сообщает о двух разных состояниях для ButtonPress и ButtonRelease, поэтому, может быть, поле состояния, одинаковое для обоих типов событий на другом сенсорном экране, все-таки связано с этим?1088 *

...