Java Swing revalidate () vs repaint ()


211

Я збираю додаток Swing, де мені часто хочеться замінити вміст JPanel. Для цього я дзвоню removeAll(), потім додаю новий вміст, потім дзвоню revalidate().

Однак я знаходжу, що старий вміст все ще є видимим (хоч і приховується новим вмістом). Якщо додати виклик repaint()на додаток до revalidate(), він працює , як очікувалося.

Я впевнений, що в інших випадках я відчував, що достатньо лише дзвінків revalidate().

Тому в основному моє запитання - чи потрібно мені викликати обидві функції, а якщо ні, то коли я повинен викликати кожну з них?


6
У цьому підручнику від Oracle зазначено: "Завжди вимагайте перефарбовування після повторної перевірки". Однак пояснення не надано.
хвилини

Відповіді:


154

Вам потрібно зателефонувати repaint()і revalidate(). Колишній каже Swing, що область вікна забруднена (що необхідно, щоб стерти зображення старих дітей, видалених removeAll()); останній повідомляє менеджеру макета перерахувати макет (що необхідно при додаванні компонентів). Це повинно спричинити перефарбування дітей на панелі, але може не призвести до того, щоб вона сама зробила це (див. Це для списку тригерів перефарбовування).

На загальну увагу: замість повторного використання оригінальної панелі я б рекомендував створити нову панель і поміняти їх у батьків.


1
Чи можете ви раціоналізувати, чому створення нової панелі є кращим рішенням, ніж використання старої? :)
Arttu

3
@Arttu - це менше роботи, а тому менше схильний до помилок.
kdgregory

86

Щоразу, коли ви робите delete () або removeAll (), вам слід зателефонувати

  validate();
  repaint();

після завершення додавання нових компонентів.

Виклик validate () або revalidate () є обов'язковим, коли ви виконайте видалення () - див. Відповідні javadocs.

Моє власне тестування вказує, що перефарбовування () також необхідне. Я не впевнений, чому саме.


59

revalidateвикликається контейнер після додавання нових компонентів або видалення старих компонентів. цей виклик - це інструкція сказати менеджеру макета скинути на основі нового списку компонентів. revalidateвикликає заклик перефарбувати те, що компонент вважає "брудними регіонами". Очевидно, що не всі регіони у вашій JPanelкраїні вважаються брудними RepaintManager.

repaintвикористовується для того, щоб повідомити компонент, щоб перефарбувати себе. Часто буває так, що вам потрібно викликати це для того, щоб очистити такі умови, як ваша.


5

revalidate()просто запит на компонування контейнера, коли у вас виникли просто виклики revalidate()робіт, це може бути викликано оновленням дочірніх меж компонентів, що викликають зміни repaint()їх меж під час перестановки. У разі , якщо ви згадали, тільки компонент видаляється і ніяких кордону компонентів не змінюються, то цей випадок не repaint()є «випадково» спрацьовує.


-4

так, вам потрібно викликати перефарбовування (); revalidate (); коли ви зателефонуєте на RemoveAll (), вам доведеться зателефонувати у перезапису () та повторно підтвердити ()

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.