У приложения Gluon возникла проблема, когда MousePressed быстро щелкнул или дважды, тройной щелчок - PullRequest
0 голосов
/ 28 мая 2019

Я разработал глюонное приложение, которое использует uuid для генерации BarCode и QRCODE. Использование может переключаться между штрих-кодом и Qrcode в зависимости от магазина. Штрих-код будет отображаться только в режиме портретного экрана при использовании нажмите на QRCODE (изображение). Таким образом, экран будет автоматически поворачиваться, когда пользователь нажимает на изображение (штрих-код / ​​QR-код).

this.img.setOnMousePressed(event -> {
//Rotate Screen
        Services.get( CMOrientationService.class ).ifPresent( o -> {
            Orientation orientation = Services.get( OrientationService.class )
                    .flatMap(OrientationService::getOrientation)
                    .orElse(Orientation.HORIZONTAL);

            Services.get(LogService.class).ifPresent(service -> service.log("orientation="+orientation.toString()));

            if (orientation == Orientation.VERTICAL) {
                Services.get(LogService.class).ifPresent(service -> service.log("Currently="+orientation.toString()));
                //Change to Barcode
                //GenerateBarQRCode(orientation == Orientation.VERTICAL);
                o.coerceOrientation( Orientation.HORIZONTAL );
            } else {
                Services.get(LogService.class).ifPresent(service -> service.log("Currently="+orientation.toString()));
                //Change to QRCode
                //GenerateBarQRCode(orientation == Orientation.VERTICAL);
                o.coerceOrientation( Orientation.VERTICAL );
            }
            GenerateBarQRCode(orientation == Orientation.VERTICAL);
        } );
});

Проблема возникает, когда пользователь пытается быстро щелкнуть изображение (двойной, тройной щелчок), оно сгенерирует неправильно.

Вы можете проверить это видео для большего понимания (посмотрите на 6 сек в видео).

Отмеченные. Это ошибка только в Android.

1 Ответ

0 голосов
/ 28 мая 2019

Вы можете использовать синхронизацию следующим образом

// At class level
private Object mutex;
//initialize this object in constructor like this
mutex = this;

this.img.setOnMousePressed(event -> {
//Rotate Screen
synchronized(mutex){
// your code here
       ....
}
});

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

// At class level
private boolean mutex = true;

this.img.setOnMousePressed(event -> {
   if(mutex){
     mutex = false;

        // your code here
               ....
     mutex = true;
   }
});
...