Спам-кнопки JavaFX MouseExit и MouseEntered - PullRequest
0 голосов
/ 27 октября 2019

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

MOUSE_EXITED MOUSE_EXITED_TARGET MOUSE_ENTERED MOUSE_ENTERED_TARGET MOUSE_EXITED MOUSE_EXITED_TARGET MOUSE_ENTERED MOUSE_ENTERED_TARGET MOUSE_EXT * нажимает на кнопку * и нажимает на эту кнопку *. 1005 *

public void handle(MouseEvent me) {
        System.out.println(me.getEventType());
        if(me.getEventType() == MouseEvent.MOUSE_ENTERED_TARGET || me.getEventType() == MouseEvent.MOUSE_MOVED) {
            nejButton.setDisable(true);
        }
        else if((me.getEventType() == MouseEvent.MOUSE_EXITED) || (me.getEventType() == MouseEvent.MOUSE_EXITED_TARGET) )nejButton.setDisable(false);
    }

1 Ответ

1 голос
/ 27 октября 2019

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

Указывает, отключен этот Node или нет. Node станет отключенным, если для disable установлено значение true либо на самом себе, либо на одном из его предков в графе сцены.

Отключенный Node должен отображать себя по-другому, указывая на его отключенное состояние. пользователю. Такой отключенный рендеринг зависит от реализации Node. Классы фигур, содержащиеся в javafx.scene.shape, не реализуют такую ​​визуализацию по умолчанию, поэтому приложения, использующие фигуры для обработки ввода, должны сами реализовать соответствующую отключенную визуализацию. Однако элементы управления пользовательского интерфейса, определенные в javafx.scene.control, будут реализовывать отображение, чувствительное к отключению.

Отключенный Node не получает события мыши или клавиши. [выделение добавлено]

Я считаю, что при отключении Node мышь «выходит» из-за того, что Node больше не может получать события мыши. Это происходит независимо от того, двигаете ли вы мышью или нет. Затем ваш код реагирует на «выход» мыши, и вы включаете Node. Однако, поскольку теперь включенный Node снова имеет право получать события мыши, а также тот факт, что вы держали мышь в том же месте, мышь снова «входит» в Node. Затем ваш код реагирует на то, что мышь «входит» в Node, и снова его отключает, вызывая бесконечный цикл.

Я подозреваю, что нет способа обойти это поведение 1 .

При этом я нахожу желаемую цель странной. Что вы пытаетесь сказать пользователю, отключив Button только при наведении на него курсора мыши? Кажется, это будет означать: « Давай, нажми эту кнопку… шучу! ». Это не похоже на приятный пользовательский опыт.


1. Поскольку отключенный узел не получает события мыши, можно утверждать, что это поведение является ошибкой. Однако остановка этого цикла не поможет вашему делу;перемещение мыши из вашей кнопки не вызовет событие выхода из мыши, независимо от того, было ли запущено событие «отключено при зависании» или нет. Я также склонен полагать, что это не ошибка.

...