Swing JPanel won't repaint

前端 未结 6 2221
傲寒
傲寒 2021-02-20 07:39

I have a simple object which extends JPanel, when the update() method is called on this object it it meant to add some labels to the panel and then rep

6条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-20 08:08

    It depends on what you want to happen and what layout managers are in use, but the basic rules are:

    1. Make sure update is called on the EDT. If it's not (SwingUtilities.isEventDispatchThread()returns false) you will need to use SwingUtilities.invokeLater to schedule the update on the EDT. For example:

      SwingUtilities.invokeLater(new Runnable() {
          public void run() {
              update();
          }});
      
    2. Call invalidate(). Most things that change a component will do this for you. So you only need to call this if the following does not work on its own.

    3. Call validate() on the highest affected component. This is probably the muddiest bit of Java's rendering cycle. The call to invalidate marks the component and all of its ancestors as needing layout. The call to validate performs the layout of the component and all of its descendants. One works "up" and the other works "down". You need to call validate on the highest component in the tree that will be affected by your change.

      Also, calling validate on a top-level component (JWindow, JDialog, JFrame) will not necessarily resize that component. To make that happen, you'll need to call pack() or setSize().

    4. If your changes alter the size or position of containers, The resized containers will repaint, but they will not erase the space the used to occupy. Calling repaint() on the parent of the container will cause it to repaint the background, correcting the damage.

提交回复
热议问题