title: NullPointerException at java.awt.Window.access$700(Window.java:132) while painting JPanel
body: <p>I'm trying to paint component inside <code>paint(Graphics)</code> method of <code>JPanel</code>.
  The following code snippet works just fine, a <code>JButton</code> is painted nicely in my <code>JPanel</code>:</p>
  
  <pre><code>        @Override
          public void paint(Graphics g) {
              super.paint(g);
              JButton btn = new JButton("hello");
              Dimension dim = btn.getPreferredSize();
              btn.setSize(dim.width, dim.height);
              btn.paint(g);   // paint the button
          }
  </code></pre>
  
  <p>The code snippet works perfectly also for other components (<code>JLabel</code>, <code>JTree</code>, ...) except <code>JPanel</code>.
  The following code will cause very strange <code>NullPointerException at java.awt.Window.access$700(Window.java:132)</code>.</p>
  
  <pre><code>        @Override
          public void paint(Graphics g) {
              super.paint(g);
              JPanel panel = new JPanel();
              panel.setSize(10, 10);
              panel.paint(g);   // paint the panel
          }
  </code></pre>
  
  <p>Here the full stacktrace:</p>
  
  <pre><code>Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
      at java.awt.Window.access$700(Window.java:132)
      at java.awt.Window$1.isOpaque(Window.java:3458)
      at javax.swing.RepaintManager.getVolatileOffscreenBuffer(RepaintManager.java:983)
      at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1395)
      at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:294)
      at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
      at javax.swing.JComponent.paint(JComponent.java:1015)
      at test.paintcontainer.TestPaintContainerMain$TestContentPane.paint(TestPaintContainerMain.java:48)
      at javax.swing.JComponent.paintChildren(JComponent.java:862)
      at javax.swing.JComponent.paint(JComponent.java:1038)
      at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
      at javax.swing.JComponent.paintChildren(JComponent.java:862)
      at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
      at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
      at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
      at javax.swing.JComponent.paint(JComponent.java:1015)
      at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
      at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
      at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
      at java.awt.Container.paint(Container.java:1780)
      at java.awt.Window.paint(Window.java:3375)
      at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
      at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
      at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
      at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
      at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
      at java.awt.EventQueue.access$000(EventQueue.java:84)
      at java.awt.EventQueue$1.run(EventQueue.java:602)
      at java.awt.EventQueue$1.run(EventQueue.java:600)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
  </code></pre>
  
  <p>Any idea how to solve this problem? I need to paint <code>JPanel</code> inside <code>paint(Graphics)</code> method.
  I wrote a simple test application which you can copy-paste to reproduce the aforementioned exception:</p>
  
  <pre><code>package test.paintcontainer;
  
  import java.awt.Color;
  import java.awt.Graphics;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  
  import javax.swing.ButtonGroup;
  import javax.swing.JButton;
  import javax.swing.JFrame;
  import javax.swing.JPanel;
  import javax.swing.JRadioButton;
  
  public class TestPaintContainerMain extends JFrame {
  
      public static void main(String[] args) {
          TestPaintContainerMain test = new TestPaintContainerMain();
          test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          test.setBounds(0, 0, 300, 200);
          test.setContentPane(new TestContentPane());
          test.setVisible(true);
      }
  
      static class TestContentPane extends JPanel {
  
          JRadioButton paintButtonCheck;
  
          JRadioButton paintPanelCheck;
  
          public TestContentPane() {
              paintButtonCheck = createRadioButton("paint button", true);
              paintPanelCheck = createRadioButton("paint panel", false);
              ButtonGroup buttonGroup = new ButtonGroup();
              buttonGroup.add(paintButtonCheck);
              buttonGroup.add(paintPanelCheck);
              add(paintButtonCheck);
              add(paintPanelCheck);
          }
  
          @Override
          public void paint(Graphics g) {
              super.paint(g);
  
              g.translate(100, 100);
              if (paintButtonCheck.isSelected()) {
                  createButton().paint(g);
              } else {
                  createPanel().paint(g);
              }
          }
  
          private JButton createButton() {
              JButton button = new JButton("button");
              button.setSize(button.getPreferredSize().width, button.getPreferredSize().height);
              return button;
          }
  
          private JPanel createPanel() {
              JPanel panel = new JPanel();
              panel.setBackground(Color.GREEN);
              panel.add(createButton());
              panel.setSize(panel.getPreferredSize().width, panel.getPreferredSize().height);
              return panel;
          }
  
          private JRadioButton createRadioButton(String title, boolean selected) {
              JRadioButton radio = new JRadioButton(title, selected);
              radio.addActionListener(new ActionListener() {
                  @Override
                  public void actionPerformed(ActionEvent e) {
                      TestContentPane.this.repaint();
                  }
              });
              return radio;
          }
      }
  
  }
  </code></pre>