Дочерний компонент с переопределенным методом paintComponent рисует компонент поверх JPanel - PullRequest
1 голос
/ 06 марта 2019

У меня есть родительский JPanel, который использует менеджер макетов OverlayLayout, а JPanel содержит основную панель и панель над слоем.

например

setLayout(new OverlayLayout(this));
add(overlayPanel)
add(mainPanel);

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

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

Я пытался использовать JLayeredPane, но я изо всех сил пытался изменить размер главного окна и поскольку он не использует LayoutManager, мне пришлось установить границы, и я изо всех сил пытался заставить это работать.

1 Ответ

2 голосов
/ 06 марта 2019

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

Однако при использовании OverlayLayout компоненты окрашиваются в 3 измерениях, поэтому рисование одного компонента может повлиять на другие компоненты.Поэтому вам нужно удалить оптимизированное рисование, которое выполняется по умолчанию:

JPanel main = new JPanel()
{
    @Override
    public boolean isOptimizedDrawingEnabled()
    {
        return false;
    }
};

main.setlayout( new OverlayLayout(main) );
main.add( overlayPanel );
main.add( backgroundPanel );

Или, в вашем случае, похоже, что вы расширяете JPanel, поэтому вам просто нужно переопределить метод isOptimizedDrawingEnabled().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...