Search code examples
javaswingjlabelgraphics2dpaintcomponent

put JLabel on top of the JPanel


When I run my code then JLabel is looking behind the JPanel. Why this is happening? I have to show the label on top of panel.

Code

public class ColoredRect extends JPanel{
          
      public double x, y, width, height;  
      public JLabel name;
      
      public ColoredRect(double x,double y,String label)
      {
          name = new JLabel(label);
          this.x = x;
          this.y = y;
          this.width = 100;
          this.height =40;
           
          setLocation((int)x,(int)y);
          setSize((int)width,(int)height);
          setBackground(Color.red);
          
          add(name);
       }

       public void paintComponent(Graphics g) {
            // Draw all the rects in the ArrayList.
        super.paintComponent(g);  // Fills with background color, white.
        name.setForeground(Color.BLACK);
        name.setVisible(true);
        name.setLocation((int)x+3, (int)y+3);
        name.setSize(20, 20);
        name.repaint();
       }
       
       public void setnewPosition(double x, double y)
      {
          this.x =x;
          this.y =y;
          this.setLocation((int)x,(int) y);
          repaint();
      }
}

Solution

  • You never used the setOpaque(), method to set it's value as being OPAQUE. Here have a look at this example, see how you draw on the JPanel and add JLabel on it.

    import java.awt.*;
    import javax.swing.*;
    
    public class PanelPaintingExample
    {
        private ColouredRectangle cRect, cRect1, cRect2;    
        private Rectangle rect;
    
        public PanelPaintingExample()
        {       
            rect = new Rectangle(0, 0, 200, 30);
        }
    
        private void displayGUI()
        {   
            JFrame frame = new JFrame("Panel Painting Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
    
            cRect = new ColouredRectangle(Color.RED, "LABEL 1"
                                                   , Color.WHITE
                                                   , rect);
            cRect1 = new ColouredRectangle(Color.BLUE, "LABEL 2"
                                                   , Color.WHITE
                                                   , rect);
            cRect2 = new ColouredRectangle(Color.MAGENTA, "LABEL 3"
                                                   , Color.WHITE
                                                   , rect);                                     
    
            frame.add(cRect);
            frame.add(cRect1);
            frame.add(cRect2);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String... args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new PanelPaintingExample().displayGUI();
                }
            });
        }
    }
    
    class ColouredRectangle extends JPanel
    {
        private Color backColour;
        private Color foreColour;
        private String text;
        private Rectangle rect;
    
        private JLabel label;
    
        public ColouredRectangle(Color b, String text
                                         , Color f, Rectangle rect)
        {
            this.backColour = b;
            this.foreColour = f;
            this.text = text;
            this.rect = rect;
    
            label = new JLabel(this.text, JLabel.CENTER);
            label.setOpaque(true);
            label.setBackground(backColour);
            label.setForeground(foreColour);
    
            add(label);
        }
    
        @Override
        public Dimension getPreferredSize()
        {
            return (new Dimension(200, 30));
        }
    
        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.setColor(backColour);
            g.fillRect((int)rect.getX(), (int)rect.getY()
                                  , (int)rect.getWidth()
                                  , (int)rect.getHeight());
        }
    }