Есть ли способ пометить только определенную область JPanel как непрозрачную?
В основном я рисую много прозрачных JPanels; Профилирование показывает, что большая часть времени проводится в Component.paint(). Можно было бы оптимизировать это довольно радикально, поскольку в большинстве случаев реальная непрозрачная область на JPanel довольно мала, например, по краям.
В настоящее время компонент repainting() будет инициировать перерисовку всех своих родителей, поскольку RepaintManager не может знать, что грязная родительская область фактически непрозрачна и будет подниматься по иерархии компонентов. Я думал о звонке markCompletelyClean()
на всех родителей всякий раз, когда панель становится недействительной и сам управляет грязными регионами addDirtyRegion()
,
Тем не менее, существует ли более четкий подход к маркировке только определенных прямоугольников JPanel как непрозрачных (или прозрачных, не имеет значения)?
3 ответа
Даже если вы делаете что-то необычное с markCompletelyClean() и addDirtyRegion(), я сомневаюсь, что вы получите большую выгоду в производительности. Когда свинг идет на перекрашивание, он объединяет все грязные области для рисования и начинает перекраску с минимальной ограничительной рамкой для всех грязных областей. Таким образом, если вы отметите периметр JPanel как грязный, то ограничивающая рамка JPanel будет такой же, как и вся JPanel, что означает, что вы будете перекрашивать всю вещь в любом случае.
Рассмотреть возможность использования JLabel
(непрозрачный по умолчанию) вместо JPanel
тогда вы сможете (к JLabel
) вы можете добавить любой JComponent
так же, как JPanel
, но вы должны установить LayoutManager
тогда ты забыл заботиться о Opacity/Transparency
и для конкретного региона (ов)
Почему вы не можете определить свой собственный метод myRepaint()
вызывая несколько
public void repaint(long tm, int x, int y, int width, int height)
для всех границ?
Также попробуйте поиграть с clipBounds вашей графики, чтобы перекрасить только действительно необходимые части. Вы можете установить любую пользовательскую форму как клип.