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);
