Есть ли способ пометить только определенную область JPanel как непрозрачную? - PullRequest
4 голосов
/ 18 ноября 2011

В основном я рисую много прозрачных JPanels; Профилирование показывает, что большая часть времени проводится в Component.paint (). Можно было бы оптимизировать это довольно радикально, поскольку в большинстве случаев реальная непрозрачная область на JPanel довольно мала, например, по краям.

В нынешнем виде компонент repainting () будет инициировать перерисовку всех его родителей, поскольку RepaintManager не может знать, что грязная родительская область фактически непрозрачна и будет подниматься по иерархии компонентов. , Я думал о том, чтобы звонить markCompletelyClean() всем родителям всякий раз, когда панель становится недействительной, и сам управлять грязными областями с помощью addDirtyRegion().

Однако, существует ли более четкий подход к маркировке только определенных прямоугольников JPanel как непрозрачных (или прозрачных, не имеет значения)?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Попробуйте использовать JLabel (по умолчанию не непрозрачный) вместо JPanel, тогда вы можете (к JLabel) добавить JComponent так же, как к JPanel, но у вас есть для установки LayoutManager, то вы забыли о заботе о Opacity/Transparency и об особенностях региона (ов)

2 голосов
/ 18 ноября 2011

Даже если вы делаете что-то необычное с markCompletelyClean () и addDirtyRegion (), я сомневаюсь, что вы получите большую выгоду в производительности. Когда свинг идет на перекрашивание, он объединяет все грязные области для рисования и начинает перерисовку с минимальной ограничительной рамкой для всех грязных областей. Таким образом, если вы отметите периметр JPanel как грязный, то ограничивающий прямоугольник JPanel будет таким же, как и весь JPanel, что означает, что вы будете перекрашивать всю вещь в любом случае.

1 голос
/ 18 ноября 2011

Почему вы не можете определить свой собственный метод myRepaint(), вызывающий несколько

public void repaint(long tm, int x, int y, int width, int height)

для всех границ?

Также попробуйте поиграть с clipBounds вашей графики, чтобы перекрашивать только действительно необходимые части. Вы можете установить любую пользовательскую форму в качестве клипа.

...