TextArea не обрабатывает MouseEvent.MOUSE_PRESSED

Я создаю приложение JavaFX, и у меня есть TextArea.
TextArea назначен класс CSS (не знаю, имеет ли это значение):

.default-cursor{
    -fx-background-color:#EEEEEE;
    -fx-cursor:default;
}

Есть 2 проблемы с этим TextArea:

  1. -fx-cursor:default; Не действует, так как курсор остается текстовым курсором. Это странно, так как я использую тот же класс для TextField с правильными/ожидаемыми результатами.
  2. TextArea не обрабатывает событие MOUSE_PRESSED
    Мой код:
    textArea.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    System.out.println("print message");
                }
            });

Есть идеи, почему?
Я хочу отметить, что когда я изменил EventHandler на дескриптор MOUSE_CLICKED, все в порядке.


person Dimitris    schedule 12.03.2014    source источник


Ответы (1)


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

Вместо этого установите EventFilter:

textArea.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                System.out.println("mouse pressed");
            }
        });

Фильтр событий будет обработан до того, как обработчики по умолчанию увидят событие.

Для вашей проблемы css попробуйте

.default-cursor .content {
  -fx-cursor: default ;
}
person James_D    schedule 12.03.2014
comment
Спасибо! Оба решения работают. Но знаете ПОЧЕМУ? Ваше решение css работает для TextArea, но не для TextField. А решение EventFilter — обходной путь и не объясняет почему. Но спасибо :) - person Dimitris; 12.03.2014
comment
Для событий, как я объяснил. Текстовая область должна обрабатывать события мыши, чтобы обрабатывать выделение и т. д. По непонятным мне причинам она потребляет эти события. Поскольку обработчики, зарегистрированные на одном уровне, выполняются в произвольном порядке, вы не контролируете, получит ли ваш обработчик событие до того, как его использует TextArea (и, по-видимому, вы получите его после). Фильтр событий всегда будет получать его перед обработчиком. - person James_D; 12.03.2014