layoutChildren вызывается бесконечно - JavaFX 2

1

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

Как в этом примере:

public class MyClass extends Pane {

  private final Pane myPane;

  public MyClass() {

    this.myPane.prefWidthProperty().bind(this.widthProperty);
    this.myPane.prefHeightProperty().bind(this.heightProperty);

    this.getChildren().add(this.myPane);
  }

  @Override
  layoutChildren() {

    this.foo();
  }

  private void foo() {

    this.myPane.getChildren().add(new Label("foo"));
  }

}

Проблема в том, что он просто бесконечно вызывает вызов layoutChildren. Странно то, что если я добавлю текст вместо метки, "проблема" не возникает.

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

Есть что-то тривиальное, что мне не хватает?

  • 0
    Почему Pane myPane внутри класса MyClass который уже расширяет Pane. Мореовр, привязка ширины и высоты? Вы должны пролить свет на то, что вы пытаетесь достичь здесь.
  • 0
    Я попытался извлечь основную проблему здесь, к сожалению, код очень сложный, и я не могу опубликовать его здесь. Здесь действительно нет смысла создавать панель внутри панели, но на самом деле это так :)
Теги:
label
javafx-2

2 ответа

1

layoutChildren вызывается постоянно QuantumToolkit. Весь граф сцены проходит, и каждый узел имеет этот метод, который вызывается во время жизни приложения. Это никогда не заканчивается.

Из Oracle:

Потоки

Система запускает два или более из следующих потоков в любой момент времени.

Тема приложения JavaFX: это основной поток, используемый разработчиками приложений JavaFX. Любая "живая" сцена, представляющая собой сцену, которая является частью окна, должна быть доступна из этого потока. Граф сцены можно создать и обработать в фоновом потоке, но когда его корневой узел подключен к любому живому объекту в сцене, этот граф сцены должен быть доступен из потока приложений JavaFX. Это позволяет разработчикам создавать сложные графики сцен в фоновом потоке, сохраняя анимацию на "живых" сценах плавно и быстро. Прикладной поток JavaFX - это другой поток из потока Swing и AWT Event Dispatch Thread (EDT), поэтому следует проявлять осторожность при внедрении кода JavaFX в приложения Swing. Призматический рендеринг: этот поток обрабатывает рендеринг отдельно от диспетчера событий. Он позволяет отображать кадр N во время обработки кадра N +1. Эта способность выполнять параллельную обработку является большим преимуществом, особенно в современных системах с несколькими процессорами. В потоке рендеринга Prism также могут быть несколько потоков растрирования, которые помогают выполнять работу, которая должна выполняться при рендеринге. Медиа-поток. Этот поток работает в фоновом режиме и синхронизирует последние кадры по графику сцены с помощью потока приложений JavaFX.

Пульс

Импульс - это событие, которое указывает графику сцены JavaFX, что настало время синхронизировать состояние элементов на графике сцены с Prism. Импульс сжимается со скоростью 60 кадров в секунду (fps) и срабатывает всякий раз, когда анимация выполняется на графике сцены. Даже когда анимация не работает, импульс запланирован, когда что-то в графе сцены изменяется. Например, если позиция кнопки изменена, запланирован импульс.

Когда импульс запускается, состояние элементов на графике сцены синхронизируется до уровня рендеринга. Импульс позволяет разработчикам приложений обрабатывать события асинхронно. Эта важная функция позволяет системе выполнять пакетные операции и выполнять события на пульсе.

Макет и CSS также привязаны к импульсным событиям. Многочисленные изменения в графике сцены могут привести к нескольким макетам или обновлениям CSS, что может серьезно ухудшить производительность. Система автоматически выполняет передачу CSS и макета один раз за каждый импульс, чтобы избежать ухудшения производительности. Разработчики приложений также могут вручную запускать макеты прохода по мере необходимости для проведения измерений до импульса.

Инструмент Glass Windowing Toolkit отвечает за выполнение импульсных событий. Для выполнения выполнения он использует собственные таймеры высокого разрешения.


Макет Дети называются 60 раз/сек на всех узлах, которые каким-то образом были изменены. Поэтому, если ребенок, находящийся на глубине графика, будет изменен, все родители этого ребенка будут иметь макет.

0

Ваш метод переопределения макетов вызывает foo, что, в свою очередь, вызывает добавление нового ярлыка. Если я не ошибаюсь, это приведет к запуску другого макета, который, в свою очередь, добавит новый ярлык, что вызовет ваш бесконечный цикл.

  • 0
    Это была моя первая мысль. Но дело в том, что если я добавлю его непосредственно в класс (this.getChildren.add ()), проблема не возникнет. Если я добавлю узел Text, ImageView или любой другой компонент, проблема не возникнет. Кажется, это происходит только тогда, когда я добавляю на вторичную панель помеченный узел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню