JAVA FX ScrollPane не позволяет запрашивать фокус на поле

Я разрабатываю клиент JavaFX. Это двухпанельное программное обеспечение. Левая панель представляет собой список, в котором показаны несколько приложений (с разными макетами), разработанных для клиента (Application_1, Application_2 и т. д.). На правой панели отображается Application_N.

Приложение, показанное на правой панели программного обеспечения, имеет следующую иерархию классов Java:

BorderPane -> Application (класс приложений, разработанный мной).

Класс Application имеет атрибут Node (тело Node), который содержит форму, а эта форма содержит атрибут Field.

Когда приложение отображается на указанной правой панели, оно вызывает метод requestFocus(), и этот метод (который перезаписывается из класса JavaFX Node) должен запрашивать фокус (используя на этот раз исходный метод requestFocus() из класса JavaFX Node) для указанного поля.

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

Приведенный ниже код взят из Application.java.

  Node body;

  body = getBody(); // getBody() builds the UI of this application

  scrollPanel = new ScrollPane();
  scrollPanel.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
  scrollPanel.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
  scrollPanel.setFitToWidth(true);
  scrollPanel.setFitToHeight(true);
  scrollPanel.getStyleClass().add("application");
  scrollPanel.setContent(body);

  this.setCenter(scrollPanel);

  ...

И теперь, когда приложение будет отображаться, оно выполняет следующий код:

   public void create(){
       requestFocus();  
   }

   @Override
   public void requestFocus(){
    accountField.requestFocus(); //using the method from the JavaFX node class
}

Я повторяю, что проблема возникает, когда я помещаю панель прокрутки в свою иерархию. Буду признателен, если у кого-то есть комментарий или решение этой проблемы. Спасибо.


person juliocarrasquel    schedule 14.08.2014    source источник
comment
Будет ли это работать, если вы оберните вызов requestFocus в Platform.runLater() или, возможно, используя этот взлом задачи для управления отложенным фокусом?   -  person jewelsea    schedule 15.08.2014
comment
Я пробовал с этим решением. Оборачиваем метод requestFocus в Platform.runLater(). Тем не менее, это работает только иногда. Я не знаю почему. Это может быть что-то с потоком Java FX, но совсем не уверен. @jewelsea   -  person juliocarrasquel    schedule 15.08.2014
comment
Я собираюсь попробовать второй вариант, который вы дали. Спасибо. @jewelsea   -  person juliocarrasquel    schedule 15.08.2014
comment
Взлом этой задачи с помощью Thread.sleep( ) не является моим предпочтительным вариантом, поскольку он не совсем точен. Вы должны играть со временем. Тем не менее, это работает, и я возьму его, пока продолжаю исследовать связь между панелью прокрутки (потому что без нее работает фокус запроса на моем конкретном дочернем узле) и потоком Java FX. Спасибо. @jewelsea   -  person juliocarrasquel    schedule 15.08.2014


Ответы (1)


Я нахожу scrollPane неполным и глючным. На этом этапе моим решением было скопировать исходники openjfx ScrollPane[Behavior|Skin] и внести необходимые хаки.

После этого вы можете изменить поведение кражи фокуса в ScrollPaneBehavior.

person Yann Le Moigne    schedule 02.05.2016