JavaFX SplitPane не всплывает событие мыши - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть BorderPane.В этой панели я установил top и HBox с несколькими элементами управления.В центре у меня есть e SplitPane с двумя полотнами.Я хочу, чтобы мышь двигалась на BorderPane, когда она всплывает от SplitPane.

Если я использую splitPane.setOnMouseMoved(...), я получаю событие правильно.Однако BorderPane.setOnMouseMoved(...) работает только тогда, когда мышь находится над top (где найден HBox).

Похоже, что SplitPane потребляет событие.Кто-нибудь может это подтвердить?Если так, как я могу заставить пузырь вспыхнуть?Обратите внимание, что когда я применяю фильтр, четность обнаруживается на уровне BorderPane на пути вниз.

TIA

1 Ответ

0 голосов
/ 17 февраля 2019

Большинство, если не все, реализации скина простираются от SkinBase, который по умолчанию использует все события мыши.Вы можете настроить это с помощью защищенного метода consumeMouseEvents(boolean).Поскольку метод защищен, вам потребуется создать подкласс скина (или использовать отражение) для доступа к нему:

package com.example;

import javafx.scene.control.SplitPane;
import javafx.scene.control.skin.SplitPaneSkin;

public class MySplitPaneSkin extends SplitPaneSkin {

    public MySplitPaneSkin(SplitPane control) {
        super(control);
        consumeMouseEvents(false);
    }

}

Классы скинов стали открытым API в JavaFX 9. Если вы используете JavaFX8 вам нужно будет расширить внутренний класс скина .

Затем вы должны установить скин SplitPane.

SplitPane pane = ...;
pane.setSkin(new MySplitPaneSkin(pane));

Вы также можете установить скин используя CSS через свойство -fx-skin:

.split-pane {
    -fx-skin: com.example.MySplitPaneSkin;
}

Обратите внимание, что использование CSS, как указано выше, установит обложку для всех SplitPane s, охватываемых таблицей стилей (если тольковы меняете их стиль стилей).Возможно, вы захотите сделать это более конкретным, указав свой SplitPane идентификатор и используя #id { ... }.

Кроме того, глядя на реализацию SplitPaneSkin в JavaFX 11.0.2, к каждому из них добавляется обработчик событий.делитель, который потребляет все события.Поскольку это частная реализация, вы не можете изменить это поведение.Другими словами, даже с помощью приведенного выше кода события мыши не будут всплывать до вашего BorderPane, когда мышь находится над разделителем.

Еще одна вещь, которую следует учитывать, - это то, что любые элементы управления в SplitPane будутскорее всего, также потреблять события мыши.Для каждого такого дочернего элемента управления вам нужно применить что-то похожее на вышеприведенное.

...