Java Swing не отрисовывает дочерние компоненты

Вопрос к ветеранам работы с библиотекой Java Swing, ну или к тем, кто хорошо понимает её работу.

Ниже изображены идентичные объекты, создаваемые одним классом. В первом компоненте все отрисовывается хорошо, как и у других в отдельности. Однако, когда я хочу добавить все эти объекты на один экран, то Swing игнорирует дочерние элементы всех компонентов после первого. Диагностика показала, что дочерние элементы есть в компонентах, однако не вызывается метод отрисовки paintComponent(). В каждом компоненте есть кастомный Layout, все дочерние элементы тоже со своей отрисовкой.

Может ли быть дело в слишком долгом выполнении данных методов?

UPD: Выполнил замеры времени работы кастомных методов: отрисовка текста выполняется в среднем за 23.6 мкс (долгое время вызвано использованием FontMetrics.getStringBounds()), работа метода CustomLayout.layoutComponent в среднем равна 43.3 мкс

UPD2: Сократил работу Layout до 10 мкс, заменил кастомные текстовые компоненты на JLabel, проблема сохранилась

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Юрий Кайдаулов

Проблема решена!

Хочу поделиться опытом с теми, кто никогда еще не создавал свой LayoutManager

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

То есть, вместо

component.setBounds(parentBounds.x + offsetX, parentBounds.y + offsetY, width, height);

Необходимо использовать

component.setBounds(offsetX, offsetY, width, height);
→ Ссылка