Запрашивать фокус, чтобы придать неправильный контроль - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь запросить фокус в форме прямоугольника в моей сцене.Когда я делаю это с помощью мыши, слушатель свойства focus не срабатывает, даже форма перемещается для фокусировки.Я попытался добавить EventListener к фигуре, чтобы вызвать метод requestFocus () для нее, но после того, как прямоугольник получил фокус, другая кнопка, у которой нет слушателей или дополнительного кода, сразу же украла фокус.После того, как я удалил эту кнопку, то же самое делает другой элемент управления (все элементы управления, которые украли фокус, находятся перед прямоугольником в порядке добавления к корневому узлу).Я попытался пройти фокусировку, используя кнопку Tab, и она работает.Итак, как я могу запросить фокусировку на прямоугольнике с помощью мыши?

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="232.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <ToolBar prefHeight="40.0" prefWidth="200.0">
        <items>
          <Button mnemonicParsing="false" text="Button" />
        </items>
      </ToolBar>
      <HBox prefHeight="100.0" prefWidth="200.0" VBox.vgrow="ALWAYS">
         <children>
            <VBox prefHeight="200.0" prefWidth="100.0">
               <children>
                  <ListView id="slotsList" prefHeight="200.0" prefWidth="200.0" />
               </children>
            </VBox>
            <FilmTimeLine HBox.hgrow="ALWAYS" fx:id="timeLine"/>
         </children>
      </HBox>
   </children>
</VBox>

Класс Rectangle, который я добавляю в сцену внутри FilmTimeLine (FilmTimeLine - это ScrollPane, у которого есть дочерний элемент Pane.прямоугольник внутри этой панели):

public class EventSlot extends Rectangle {

    public EventSlot() {
        setFocusTraversable(true);
        setWidth(100);
        setHeight(25);
        setFill(Color.web("#9DD3DF"));
        focusedProperty().addListener((observable, oldValue, newValue) -> {
            if (isFocused()) {
                setEffect(FOCUSED_EFFECT);
            } else {
                setEffect(INNER_SHADOW);
            }
        });
        addEventHandler(MouseEvent.MOUSE_PRESSED, (mouseEvent) -> {
            requestFocus();
        });
    }
}

GIF того, что происходит

1 Ответ

1 голос
/ 23 июня 2019

Когда происходит действие, система создает событие route .

Похоже, что ваше событие мыши обрабатывается Rectangle (я предполагаю, что оно унаследовано от Node), Pane и FilmTimeLine.Поэтому нам нужно построить маршрут события, чтобы игнорировать / фильтровать все узлы, кроме выбранного прямоугольника.

Параметры для изменения маршрута:

  • Использование события.Вызвать mouseEvent. использовать (), чтобы остановить распространение события.
addEventHandler(MouseEvent.MOUSE_CLECKED, (mouseEvent) -> {
    requestFocus();
    mouseEvent.consume();
});
  • Создание прозрачного узла мыши родительского узла. setMouseTransparent (true).Если true, этот узел (вместе со всеми его дочерними элементами) является полностью прозрачным, поэтому убедитесь, что свойство mouseTransparent всех прямоугольников имеет значение false.
pane.setMouseTransparent(true);//the FilmTimeLine is a ScrollPane that has a Pane child
  • Добавление узла фильтра событий. addEventFilter
pane.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) { event.consume(); };
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...