user591790
user591790

Reputation: 555

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();
      }
}

Upvotes: 1

Views: 5003

Answers (3)

nIcE cOw
nIcE cOw

Reputation: 24626

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());
    }
}

Upvotes: 5

padman
padman

Reputation: 501

I checked entire code and executed

actually the label is on the top of the JPanel but it location gone to out of the jpanel boundary when you calling/object creating for "ColoredRect()" pass the parameters as minimum as

//pass the values and check it
ColoredRect(77,17,"string");

because location of label is x+3 and y+3 means 77+3+label width 20=100; x+3 means 17+3+ label heigth 20=40,

if you pass more than 77,17 the label location out of panel boundary

OR change the

this.width = 1000;
this.height =500;

Upvotes: 1

Fredrik LS
Fredrik LS

Reputation: 1480

Depending on what text you want to add to your JLabel, you set the size of the label in paintComponent(Graphics g) to be 20 px wide and 20 px height. 20 px width isn't very wide. Try to increase the label width if you have a label text longer than a couple of chars.

Upvotes: 1

Related Questions